twelve <- read.csv("C:/Users/farlc_000/Documents/2012.csv")
fourteen <- read.csv("C:/Users/farlc_000/Documents/2014.csv")
sixteen <- read.csv("C:/Users/farlc_000/Documents/2016.csv")
library(randomForest)
library(caret)
fit16 = randomForest(data = sixteen[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fit16, type=2)
VI <- importance(fit16)
write.csv(VI, file = "VI16.csv", row.names = T)
sorted <- read.csv("VI16.csv")
barplot(sorted$IncNodePurity[1:15], horiz = T, names.arg = sorted$Var[1:15])
fit12 = randomForest(data = twelve[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fit12, type=2)
VI <- importance(fit12)
write.csv(VI, file = "VI12.csv", row.names = T)
fit14 = randomForest(data = fourteen[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fit14, type=2)
VI <- importance(fit14)
write.csv(VI, file = "VI14.csv", row.names = T)
data1416 <- rbind(fourteen, sixteen)
AllData <- rbind(twelve, data1416)
X <- split(AllData, AllData$X)
cali <- X[[1]]
penn <- X[[2]]
tx <- X[[3]]
wash <- X[[4]]
fitcali <- randomForest(data = cali[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fitcali, type = 2)
fitwash <- randomForest(data = wash[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fitwash, type = 2)
fittx <- randomForest(data = tx[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fittx, type = 2)
fitpenn <- randomForest(data = penn[,-(1:4)], DemocraticTwoPartyVoteshare ~.)
varImpPlot(fitpenn, type = 2)
VI <- importance(fitpenn)
write.csv(VI, file = "VIPA.csv", row.names = T)
VI <- importance(fittx)
write.csv(VI, file = "VITX.csv", row.names = T)
VI <- importance(fitwash)
write.csv(VI, file = "VIWA.csv", row.names = T)
VI <- importance(fitcali)
write.csv(VI, file = "VICA.csv", row.names = T)
WAneighbor <- read.csv("~/Senior Year/Senior Design/Washington Neighbors.csv", header = T, row.names = 1)
PAneighbor <- read.csv("~/Senior Year/Senior Design/Pennsylvania Neighbors.csv", header = T, row.names = 1)
TXneighbor <- read.csv("~/Senior Year/Senior Design/Texas Neighbors v2.csv", header = T, row.names = 1)
CAneighbor <- read.csv("~/Senior Year/Senior Design/California Neighbors.csv", header = T, row.names = 1)
cali$DistrictNum <- cali$GEO.id2 - 600
wash$DistrictNum <- wash$GEO.id2 - 5300
penn$DistrictNum <- penn$GEO.id2 - 4200
tx$DistrictNum <- tx$GEO.id2 - 4800
cali2012 <- cali[(1:53),]
wash2012 <- wash[(1:10),]
penn2012 <- penn[(1:18),]
tx2012 <- tx[(1:36),]
neighbordifference <- function(district, demo, neighbor){ #assumes both are vectors of equal size
n <- sum(neighbor)
nbrsdem <- demo[which(neighbor)]
differences <- abs(demo[district] - nbrsdem)
neighbordifference <- sum(differences) / n
}
num_districts <- length(cali2012$GEO.id)
agdifferencesCA <- rep(NA, num_districts)
vetdifferencesCA <- rep(NA, num_districts)
blackdifferencesCA <- rep(NA, num_districts)
incomedifferencesCA <- rep(NA, num_districts)
foreigndifferencesCA <- rep(NA, num_districts)
unempdifferencesCA <- rep(NA, num_districts)
youngdifferencesCA <- rep(NA, num_districts)
somecollegedifferencesCA <- rep(NA, num_districts)
whitedifferencesCA <- rep(NA, num_districts)
tworacedifferencesCA <- rep(NA, num_districts)
elderlydifferencesCA <- rep(NA, num_districts)
tradedifferencesCA <- rep(NA, num_districts)
englishdifferencesCA <- rep(NA, num_districts)
marrieddifferencesCA <- rep(NA, num_districts)
hispanicdifferencesCA <- rep(NA, num_districts)
enrolleddifferencesCA <- rep(NA, num_districts)
for (i in 1:num_districts){
agdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_EC50, unname(CAneighbor[,i]))
vetdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC101, unname(CAneighbor[,i]))
blackdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_DH95, unname(CAneighbor[,i]))
incomedifferencesCA[i] <- neighbordifference(i, cali2012$HC01_EC118, unname(CAneighbor[,i]))
foreigndifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC140, unname(CAneighbor[,i]))
unempdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_EC12, unname(CAneighbor[,i]))
youngdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_EST_ASB02, unname(CAneighbor[,i]))
somecollegedifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC89, unname(CAneighbor[,i]))
whitedifferencesCA[i] <- neighbordifference(i, cali2012$HC03_DH94, unname(CAneighbor[,i]))
tworacedifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC101, unname(CAneighbor[,i]))
elderlydifferencesCA[i] <- neighbordifference(i, cali2012$HC03_DH102, unname(CAneighbor[,i]))
tradedifferencesCA[i] <- neighbordifference(i, cali2012$HC03_EC53, unname(CAneighbor[,i]))
englishdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC171, unname(CAneighbor[,i]))
marrieddifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC45, unname(CAneighbor[,i]))
hispanicdifferencesCA[i] <- neighbordifference(i, cali2012$HC03_DH88, unname(CAneighbor[,i]))
enrolleddifferencesCA[i] <- neighbordifference(i, cali2012$HC03_SC81, unname(CAneighbor[,i]))
}
num_districts <- length(wash2012$DistrictNum)
agdifferencesWA <- rep(NA, num_districts)
vetdifferencesWA <- rep(NA, num_districts)
blackdifferencesWA <- rep(NA, num_districts)
incomedifferencesWA <- rep(NA, num_districts)
foreigndifferencesWA <- rep(NA, num_districts)
unempdifferencesWA <- rep(NA, num_districts)
youngdifferencesWA <- rep(NA, num_districts)
somecollegedifferencesWA <- rep(NA, num_districts)
whitedifferencesWA <- rep(NA, num_districts)
tworacedifferencesWA <- rep(NA, num_districts)
elderlydifferencesWA <- rep(NA, num_districts)
tradedifferencesWA <- rep(NA, num_districts)
englishdifferencesWA <- rep(NA, num_districts)
marrieddifferencesWA <- rep(NA, num_districts)
hispanicdifferencesWA <- rep(NA, num_districts)
enrolleddifferencesWA <- rep(NA, num_districts)
for (i in 1:num_districts){
agdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_EC50, unname(WAneighbor[,i]))
vetdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC101, unname(WAneighbor[,i]))
blackdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_DH95, unname(WAneighbor[,i]))
incomedifferencesWA[i] <- neighbordifference(i, wash2012$HC01_EC118, unname(WAneighbor[,i]))
foreigndifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC140, unname(WAneighbor[,i]))
unempdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_EC12, unname(WAneighbor[,i]))
youngdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_EST_ASB02, unname(WAneighbor[,i]))
somecollegedifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC89, unname(WAneighbor[,i]))
whitedifferencesWA[i] <- neighbordifference(i, wash2012$HC03_DH94, unname(WAneighbor[,i]))
tworacedifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC101, unname(WAneighbor[,i]))
elderlydifferencesWA[i] <- neighbordifference(i, wash2012$HC03_DH102, unname(WAneighbor[,i]))
tradedifferencesWA[i] <- neighbordifference(i, wash2012$HC03_EC53, unname(WAneighbor[,i]))
englishdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC171, unname(WAneighbor[,i]))
marrieddifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC45, unname(WAneighbor[,i]))
hispanicdifferencesWA[i] <- neighbordifference(i, wash2012$HC03_DH88, unname(WAneighbor[,i]))
enrolleddifferencesWA[i] <- neighbordifference(i, wash2012$HC03_SC81, unname(WAneighbor[,i]))
}
num_districts <- length(penn2012$DistrictNum)
agdifferencesPA <- rep(NA, num_districts)
vetdifferencesPA <- rep(NA, num_districts)
blackdifferencesPA <- rep(NA, num_districts)
incomedifferencesPA <- rep(NA, num_districts)
foreigndifferencesPA <- rep(NA, num_districts)
unempdifferencesPA <- rep(NA, num_districts)
youngdifferencesPA <- rep(NA, num_districts)
somecollegedifferencesPA <- rep(NA, num_districts)
whitedifferencesPA <- rep(NA, num_districts)
tworacedifferencesPA <- rep(NA, num_districts)
elderlydifferencesPA <- rep(NA, num_districts)
tradedifferencesPA <- rep(NA, num_districts)
englishdifferencesPA <- rep(NA, num_districts)
marrieddifferencesPA <- rep(NA, num_districts)
hispanicdifferencesPA <- rep(NA, num_districts)
enrolleddifferencesPA <- rep(NA, num_districts)
for (i in 1:num_districts){
agdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_EC50, unname(PAneighbor[,i]))
vetdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC101, unname(PAneighbor[,i]))
blackdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_DH95, unname(PAneighbor[,i]))
incomedifferencesPA[i] <- neighbordifference(i, penn2012$HC01_EC118, unname(PAneighbor[,i]))
foreigndifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC140, unname(PAneighbor[,i]))
unempdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_EC12, unname(PAneighbor[,i]))
youngdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_EST_ASB02, unname(PAneighbor[,i]))
somecollegedifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC89, unname(PAneighbor[,i]))
whitedifferencesPA[i] <- neighbordifference(i, penn2012$HC03_DH94, unname(PAneighbor[,i]))
tworacedifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC101, unname(PAneighbor[,i]))
elderlydifferencesPA[i] <- neighbordifference(i, penn2012$HC03_DH102, unname(PAneighbor[,i]))
tradedifferencesPA[i] <- neighbordifference(i, penn2012$HC03_EC53, unname(PAneighbor[,i]))
englishdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC171, unname(PAneighbor[,i]))
marrieddifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC45, unname(PAneighbor[,i]))
hispanicdifferencesPA[i] <- neighbordifference(i, penn2012$HC03_DH88, unname(PAneighbor[,i]))
enrolleddifferencesPA[i] <- neighbordifference(i, penn2012$HC03_SC81, unname(PAneighbor[,i]))
}
num_districts <- length(tx2012$DistrictNum)
agdifferencesTX <- rep(NA, num_districts)
vetdifferencesTX <- rep(NA, num_districts)
blackdifferencesTX <- rep(NA, num_districts)
incomedifferencesTX <- rep(NA, num_districts)
foreigndifferencesTX <- rep(NA, num_districts)
unempdifferencesTX <- rep(NA, num_districts)
youngdifferencesTX <- rep(NA, num_districts)
somecollegedifferencesTX <- rep(NA, num_districts)
whitedifferencesTX <- rep(NA, num_districts)
tworacedifferencesTX <- rep(NA, num_districts)
elderlydifferencesTX <- rep(NA, num_districts)
tradedifferencesTX <- rep(NA, num_districts)
englishdifferencesTX <- rep(NA, num_districts)
marrieddifferencesTX <- rep(NA, num_districts)
hispanicdifferencesTX <- rep(NA, num_districts)
enrolleddifferencesTX <- rep(NA, num_districts)
for (i in 1:num_districts){
agdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_EC50, unname(TXneighbor[,i]))
vetdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC101, unname(TXneighbor[,i]))
blackdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_DH95, unname(TXneighbor[,i]))
incomedifferencesTX[i] <- neighbordifference(i, tx2012$HC01_EC118, unname(TXneighbor[,i]))
foreigndifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC140, unname(TXneighbor[,i]))
unempdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_EC12, unname(TXneighbor[,i]))
youngdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_EST_ASB02, unname(TXneighbor[,i]))
somecollegedifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC89, unname(TXneighbor[,i]))
whitedifferencesTX[i] <- neighbordifference(i, tx2012$HC03_DH94, unname(TXneighbor[,i]))
tworacedifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC101, unname(TXneighbor[,i]))
elderlydifferencesTX[i] <- neighbordifference(i, tx2012$HC03_DH102, unname(TXneighbor[,i]))
tradedifferencesTX[i] <- neighbordifference(i, tx2012$HC03_EC53, unname(TXneighbor[,i]))
englishdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC171, unname(TXneighbor[,i]))
marrieddifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC45, unname(TXneighbor[,i]))
hispanicdifferencesTX[i] <- neighbordifference(i, tx2012$HC03_DH88, unname(TXneighbor[,i]))
enrolleddifferencesTX[i] <- neighbordifference(i, tx2012$HC03_SC81, unname(TXneighbor[,i]))
}
agconfCA <- t.test(agdifferencesCA, conf.level = 0.95)$conf.int
agconfWA <- t.test(agdifferencesWA, conf.level = 0.95)$conf.int
agconfPA <- t.test(agdifferencesPA, conf.level = 0.95)$conf.int
agconfTX <- t.test(agdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(agdifferencesCA), mean(agdifferencesWA), mean(agdifferencesPA), mean(agdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Percentage of Agriculture Workers", 4)
lowerconf <- c(agconfCA[1], agconfWA[1], agconfPA[1], agconfTX[1])
upperconf <- c(agconfCA[2], agconfWA[2], agconfPA[2], agconfTX[2])
agdf <- data.frame(states, means, lowerconf, upperconf, label)
vetconfCA <- t.test(vetdifferencesCA, conf.level = 0.95)$conf.int
vetconfWA <- t.test(vetdifferencesWA, conf.level = 0.95)$conf.int
vetconfPA <- t.test(vetdifferencesPA, conf.level = 0.95)$conf.int
vetconfTX <- t.test(vetdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(vetdifferencesCA), mean(vetdifferencesWA), mean(vetdifferencesPA), mean(vetdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Percentage of Veterans", 4)
lowerconf <- c(vetconfCA[1], vetconfWA[1], vetconfPA[1], vetconfTX[1])
upperconf <- c(vetconfCA[2], vetconfWA[2], vetconfPA[2], vetconfTX[2])
vetdf <- data.frame(states, means, lowerconf, upperconf, label)
blackconfCA <- t.test(blackdifferencesCA, conf.level = 0.95)$conf.int
blackconfWA <- t.test(blackdifferencesWA, conf.level = 0.95)$conf.int
blackconfPA <- t.test(blackdifferencesPA, conf.level = 0.95)$conf.int
blackconfTX <- t.test(blackdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(blackdifferencesCA), mean(blackdifferencesWA), mean(blackdifferencesPA), mean(blackdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Population Black", 4)
lowerconf <- c(blackconfCA[1], blackconfWA[1], blackconfPA[1], blackconfTX[1])
upperconf <- c(blackconfCA[2], blackconfWA[2], blackconfPA[2], blackconfTX[2])
blackdf <- data.frame(states, means, lowerconf, upperconf, label)
incomeconfCA <- t.test(incomedifferencesCA, conf.level = 0.95)$conf.int
incomeconfWA <- t.test(incomedifferencesWA, conf.level = 0.95)$conf.int
incomeconfPA <- t.test(incomedifferencesPA, conf.level = 0.95)$conf.int
incomeconfTX <- t.test(incomedifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(incomedifferencesCA), mean(incomedifferencesWA), mean(incomedifferencesPA), mean(incomedifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Per Capita Income Difference", 4)
lowerconf <- c(incomeconfCA[1], incomeconfWA[1], incomeconfPA[1], incomeconfTX[1])
upperconf <- c(incomeconfCA[2], incomeconfWA[2], incomeconfPA[2], incomeconfTX[2])
incomedf <- data.frame(states, means, lowerconf, upperconf, label)
foreignconfCA <- t.test(foreigndifferencesCA, conf.level = 0.95)$conf.int
foreignconfWA <- t.test(foreigndifferencesWA, conf.level = 0.95)$conf.int
foreignconfPA <- t.test(foreigndifferencesPA, conf.level = 0.95)$conf.int
foreignconfTX <- t.test(foreigndifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(foreigndifferencesCA), mean(foreigndifferencesWA), mean(foreigndifferencesPA), mean(foreigndifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Foreign Born", 4)
lowerconf <- c(foreignconfCA[1], foreignconfWA[1], foreignconfPA[1], foreignconfTX[1])
upperconf <- c(foreignconfCA[2], foreignconfWA[2], foreignconfPA[2], foreignconfTX[2])
foreigndf <- data.frame(states, means, lowerconf, upperconf, label)
unempconfCA <- t.test(unempdifferencesCA, conf.level = 0.95)$conf.int
unempconfWA <- t.test(unempdifferencesWA, conf.level = 0.95)$conf.int
unempconfPA <- t.test(unempdifferencesPA, conf.level = 0.95)$conf.int
unempconfTX <- t.test(unempdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(unempdifferencesCA), mean(unempdifferencesWA), mean(unempdifferencesPA), mean(unempdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Unemployment Rate", 4)
lowerconf <- c(unempconfCA[1], unempconfWA[1], unempconfPA[1], unempconfTX[1])
upperconf <- c(unempconfCA[2], unempconfWA[2], unempconfPA[2], unempconfTX[2])
unempdf <- data.frame(states, means, lowerconf, upperconf, label)
youngconfCA <- t.test(youngdifferencesCA, conf.level = 0.95)$conf.int
youngconfWA <- t.test(youngdifferencesWA, conf.level = 0.95)$conf.int
youngconfPA <- t.test(youngdifferencesPA, conf.level = 0.95)$conf.int
youngconfTX <- t.test(youngdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(youngdifferencesCA), mean(youngdifferencesWA), mean(youngdifferencesPA), mean(youngdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Aged 20-34", 4)
lowerconf <- c(youngconfCA[1], youngconfWA[1], youngconfPA[1], youngconfTX[1])
upperconf <- c(youngconfCA[2], youngconfWA[2], youngconfPA[2], youngconfTX[2])
youngdf <- data.frame(states, means, lowerconf, upperconf, label)
somecollegeconfCA <- t.test(somecollegedifferencesCA, conf.level = 0.95)$conf.int
somecollegeconfWA <- t.test(somecollegedifferencesWA, conf.level = 0.95)$conf.int
somecollegeconfPA <- t.test(somecollegedifferencesPA, conf.level = 0.95)$conf.int
somecollegeconfTX <- t.test(somecollegedifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(somecollegedifferencesCA), mean(somecollegedifferencesWA), mean(somecollegedifferencesPA), mean(somecollegedifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage with Some College but No Degree", 4)
lowerconf <- c(somecollegeconfCA[1], somecollegeconfWA[1], somecollegeconfPA[1], somecollegeconfTX[1])
upperconf <- c(somecollegeconfCA[2], somecollegeconfWA[2], somecollegeconfPA[2], somecollegeconfTX[2])
somecollegedf <- data.frame(states, means, lowerconf, upperconf, label)
whiteconfCA <- t.test(whitedifferencesCA, conf.level = 0.95)$conf.int
whiteconfWA <- t.test(whitedifferencesWA, conf.level = 0.95)$conf.int
whiteconfPA <- t.test(whitedifferencesPA, conf.level = 0.95)$conf.int
whiteconfTX <- t.test(whitedifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(whitedifferencesCA), mean(whitedifferencesWA), mean(whitedifferencesPA), mean(whitedifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage White", 4)
lowerconf <- c(whiteconfCA[1], whiteconfWA[1], whiteconfPA[1], whiteconfTX[1])
upperconf <- c(whiteconfCA[2], whiteconfWA[2], whiteconfPA[2], whiteconfTX[2])
whitedf <- data.frame(states, means, lowerconf, upperconf, label)
tworaceconfCA <- t.test(tworacedifferencesCA, conf.level = 0.95)$conf.int
tworaceconfWA <- t.test(tworacedifferencesWA, conf.level = 0.95)$conf.int
tworaceconfPA <- t.test(tworacedifferencesPA, conf.level = 0.95)$conf.int
tworaceconfTX <- t.test(tworacedifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(tworacedifferencesCA), mean(tworacedifferencesWA), mean(tworacedifferencesPA), mean(tworacedifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Biracial", 4)
lowerconf <- c(tworaceconfCA[1], tworaceconfWA[1], tworaceconfPA[1], tworaceconfTX[1])
upperconf <- c(tworaceconfCA[2], tworaceconfWA[2], tworaceconfPA[2], tworaceconfTX[2])
tworacedf <- data.frame(states, means, lowerconf, upperconf, label)
elderlyconfCA <- t.test(elderlydifferencesCA, conf.level = 0.95)$conf.int
elderlyconfWA <- t.test(elderlydifferencesWA, conf.level = 0.95)$conf.int
elderlyconfPA <- t.test(elderlydifferencesPA, conf.level = 0.95)$conf.int
elderlyconfTX <- t.test(elderlydifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(elderlydifferencesCA), mean(elderlydifferencesWA), mean(elderlydifferencesPA), mean(elderlydifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage of Elderly Under the Poverty Line", 4)
lowerconf <- c(elderlyconfCA[1], elderlyconfWA[1], elderlyconfPA[1], elderlyconfTX[1])
upperconf <- c(elderlyconfCA[2], elderlyconfWA[2], elderlyconfPA[2], elderlyconfTX[2])
elderlydf <- data.frame(states, means, lowerconf, upperconf, label)
tradeconfCA <- t.test(tradedifferencesCA, conf.level = 0.95)$conf.int
tradeconfWA <- t.test(tradedifferencesWA, conf.level = 0.95)$conf.int
tradeconfPA <- t.test(tradedifferencesPA, conf.level = 0.95)$conf.int
tradeconfTX <- t.test(tradedifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(tradedifferencesCA), mean(tradedifferencesWA), mean(tradedifferencesPA), mean(tradedifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Employed in Wholesale Trade", 4)
lowerconf <- c(tradeconfCA[1], tradeconfWA[1], tradeconfPA[1], tradeconfTX[1])
upperconf <- c(tradeconfCA[2], tradeconfWA[2], tradeconfPA[2], tradeconfTX[2])
tradedf <- data.frame(states, means, lowerconf, upperconf, label)
englishconfCA <- t.test(englishdifferencesCA, conf.level = 0.95)$conf.int
englishconfWA <- t.test(englishdifferencesWA, conf.level = 0.95)$conf.int
englishconfPA <- t.test(englishdifferencesPA, conf.level = 0.95)$conf.int
englishconfTX <- t.test(englishdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(englishdifferencesCA), mean(englishdifferencesWA), mean(englishdifferencesPA), mean(englishdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Percentage Speaking English at Home Difference", 4)
lowerconf <- c(englishconfCA[1], englishconfWA[1], englishconfPA[1], englishconfTX[1])
upperconf <- c(englishconfCA[2], englishconfWA[2], englishconfPA[2], englishconfTX[2])
englishdf <- data.frame(states, means, lowerconf, upperconf, label)
marriedconfCA <- t.test(marrieddifferencesCA, conf.level = 0.95)$conf.int
marriedconfWA <- t.test(marrieddifferencesWA, conf.level = 0.95)$conf.int
marriedconfPA <- t.test(marrieddifferencesPA, conf.level = 0.95)$conf.int
marriedconfTX <- t.test(marrieddifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(marrieddifferencesCA), mean(marrieddifferencesWA), mean(marrieddifferencesPA), mean(marrieddifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Percentage of Married Women Difference", 4)
lowerconf <- c(marriedconfCA[1], marriedconfWA[1], marriedconfPA[1], marriedconfTX[1])
upperconf <- c(marriedconfCA[2], marriedconfWA[2], marriedconfPA[2], marriedconfTX[2])
marrieddf <- data.frame(states, means, lowerconf, upperconf, label)
hispanicconfCA <- t.test(hispanicdifferencesCA, conf.level = 0.95)$conf.int
hispanicconfWA <- t.test(hispanicdifferencesWA, conf.level = 0.95)$conf.int
hispanicconfPA <- t.test(hispanicdifferencesPA, conf.level = 0.95)$conf.int
hispanicconfTX <- t.test(hispanicdifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(hispanicdifferencesCA), mean(hispanicdifferencesWA), mean(hispanicdifferencesPA), mean(hispanicdifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Difference in Percentage Population Hispanic", 4)
lowerconf <- c(hispanicconfCA[1], hispanicconfWA[1], hispanicconfPA[1], hispanicconfTX[1])
upperconf <- c(hispanicconfCA[2], hispanicconfWA[2], hispanicconfPA[2], hispanicconfTX[2])
hispanicdf <- data.frame(states, means, lowerconf, upperconf, label)
enrolledconfCA <- t.test(enrolleddifferencesCA, conf.level = 0.95)$conf.int
enrolledconfWA <- t.test(enrolleddifferencesWA, conf.level = 0.95)$conf.int
enrolledconfPA <- t.test(enrolleddifferencesPA, conf.level = 0.95)$conf.int
enrolledconfTX <- t.test(enrolleddifferencesTX, conf.level = 0.95)$conf.int
means <- c(mean(enrolleddifferencesCA), mean(enrolleddifferencesWA), mean(enrolleddifferencesPA), mean(enrolleddifferencesTX))
states <- c("California", "Washington", "Pennsylvania", "Texas")
label <- rep("Percent Enrolled in College Difference", 4)
lowerconf <- c(enrolledconfCA[1], enrolledconfWA[1], enrolledconfPA[1], enrolledconfTX[1])
upperconf <- c(enrolledconfCA[2], enrolledconfWA[2], enrolledconfPA[2], enrolledconfTX[2])
enrolleddf <- data.frame(states, means, lowerconf, upperconf, label)
ggplot(vetdf, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1))
vetag <- rbind(agdf, vetdf)
ggplot(vetag, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1))
ggplot(agdf, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1))
ggplot(blackdf, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1))
ggplot(incomedf, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1))
plot1 <- do.call("rbind", list(blackdf, agdf, vetdf))
plot2 <- do.call("rbind", list(unempdf, youngdf, somecollegedf, whitedf))
plot3 <- do.call("rbind", list(tworacedf, elderlydf, tradedf, englishdf))
plot4 <- do.call("rbind", list(marrieddf, hispanicdf, enrolleddf))
ggplot(plot1, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0)

ggplot(plot2, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0)

ggplot(plot3, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0)

ggplot(plot4, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0)

englishAllDistricts <- c(englishdifferencesCA, englishdifferencesPA, englishdifferencesTX, englishdifferencesWA)
allStates <- c(rep("California",53), rep("Pennsylvania",18), rep("Texas",36), rep("Washington", 10))
district <- c(cali2012$DistrictNum, penn2012$DistrictNum, tx2012$DistrictNum, wash2012$DistrictNum)
allCommission <- c(rep("Independent", 63), rep("Partisan", 54))
englishBoxDF <- data.frame(englishAllDistricts, allStates, district)
check_outlier <- function(v, coef=1.51){
quantiles <- quantile(v,probs=c(0.25,0.75))
IQR <- quantiles[2]-quantiles[1]
res <- v < (quantiles[1]-coef*IQR)|v > (quantiles[2]+coef*IQR)
return(res)
}
library(dplyr)
commissionEnglish <- englishBoxDF %>%
mutate(commission = ifelse(allStates == "California", "Independent", ifelse(allStates == "Washington", "Independent", "Partisan")))
independentEnglish <- commissionEnglish %>%
filter(commission == "Independent") %>%
mutate(outliers = ifelse(check_outlier(englishAllDistricts), paste(allStates, as.character(district), sep = " "), ""))
partisanEnglish <- commissionEnglish %>%
filter(commission == "Partisan") %>%
mutate(outliers = ifelse(check_outlier(englishAllDistricts), paste(allStates, as.character(district), sep = " "), ""))
outlierEnglish <- rbind(independentEnglish, partisanEnglish)
library(ggrepel)
ggplot(data = outlierEnglish, aes(x = commission, y = englishAllDistricts, color = commission)) +
geom_boxplot() + ggtitle("Absolute Difference of Percentage Speaking English at Home") +
theme(plot.title = element_text(hjust = 0.5)) + geom_text_repel(aes(label=outliers))

plot5 <- do.call("rbind", list(whitedf,blackdf, hispanicdf, tworacedf))
plot6 <- do.call("rbind", list(unempdf, elderlydf, tradedf, agdf))
plot7 <- do.call("rbind", list(enrolleddf, somecollegedf, vetdf))
plot8 <- do.call("rbind", list(youngdf, marrieddf, englishdf))
ggplot(plot5, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0) + ggtitle("Race Differences by State") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5))

ggplot(plot6, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0) + ggtitle("Race Differences by State") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5))

ggplot(plot7, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0) + ggtitle("Educational Congressional District Neighbor Differences by State") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5))

ggplot(plot8, aes(x = label, y = means, color = states)) +
geom_point(size = 4, shape = 18, position = position_dodge(width=1)) +
geom_errorbar(aes(ymax = upperconf, ymin = lowerconf), position = position_dodge(width=1)) +
geom_hline(yintercept = 0) + ggtitle("Social Statistic Congressional District Neighbor Differences by State") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5))

whiteAllDistricts <- c(whitedifferencesCA, whitedifferencesWA, whitedifferencesTX, whitedifferencesPA)
blackAllDistricts <- c(blackdifferencesCA, blackdifferencesWA, blackdifferencesTX, blackdifferencesPA)
hispanicAllDistricts <- c(hispanicdifferencesCA, hispanicdifferencesWA, hispanicdifferencesTX, hispanicdifferencesPA)
tworaceAllDistricts <- c(tworacedifferencesCA, tworacedifferencesWA, tworacedifferencesTX, tworacedifferencesPA)
labels <- c(rep("Percentage White Difference", 117), rep("Percentage Black Difference", 117), rep("Percentage Hispanic Difference", 117),
rep("Percentage Biracial Difference",117))
raceData <- c(whiteAllDistricts, blackAllDistricts, hispanicAllDistricts, tworaceAllDistricts)
allStates <- rep(c(rep("California",53), rep("Washington",10), rep("Texas",36), rep("Pennsylvania", 18)),4)
allCommission <- rep(c(rep("Independent", 63), rep("Partisan", 54)),4)
district <- rep(c(cali2012$DistrictNum, wash2012$DistrictNum, tx2012$DistrictNum, penn2012$DistrictNum),4)
raceBoxDF <- data.frame(raceData, allStates, allCommission, district, labels)
unempAllDistricts <- c(unempdifferencesCA, unempdifferencesWA, unempdifferencesTX, unempdifferencesPA)
elderlyAllDistricts <- c(elderlydifferencesCA, elderlydifferencesWA, elderlydifferencesTX, elderlydifferencesPA)
tradeAllDistricts <- c(tradedifferencesCA, tradedifferencesWA, tradedifferencesTX, tradedifferencesPA)
agAllDistricts <- c(agdifferencesCA, agdifferencesWA, agdifferencesTX, agdifferencesPA)
enrolledAllDistricts <- c(enrolleddifferencesCA, enrolleddifferencesWA, enrolleddifferencesTX, enrolleddifferencesPA)
somecollegeAllDistricts <- c(somecollegedifferencesCA, somecollegedifferencesWA, somecollegedifferencesTX, somecollegedifferencesPA)
vetAllDistricts <- c(vetdifferencesCA, vetdifferencesWA, vetdifferencesTX, vetdifferencesPA)
youngAllDistricts <- c(youngdifferencesCA, youngdifferencesWA, youngdifferencesTX, youngdifferencesPA)
marriedAllDistricts <- c(marrieddifferencesCA, marrieddifferencesWA, marrieddifferencesTX, marrieddifferencesPA)
foreignAllDistricts <- c(foreigndifferencesCA, foreigndifferencesWA, foreigndifferencesTX, foreigndifferencesPA)
incomeAllDistricts <- c(incomedifferencesCA, incomedifferencesWA, incomedifferencesTX, incomedifferencesPA)
allData <- c(raceData, unempAllDistricts, elderlyAllDistricts, tradeAllDistricts, agAllDistricts, enrolledAllDistricts,
somecollegeAllDistricts, vetAllDistricts, youngAllDistricts, marriedAllDistricts, englishAllDistricts,
foreignAllDistricts, incomeAllDistricts)
labels <- c(rep("Percentage White Difference", 117),
rep("Percentage Black Difference", 117),
rep("Percentage Hispanic Difference", 117),
rep("Percentage Biracial Difference",117),
rep("Unemployment Rate Difference",117),
rep("Percent Poor Elderly Difference", 117),
rep("Percent Employed in Wholesale Trade Difference", 117),
rep("Percent Employed in Agriculture Difference", 117),
rep("Percent Enrolled in College Difference", 117),
rep("Percent College Dropout Difference", 117),
rep("Veteran Population Difference", 117),
rep("Percent Age 20-34 Difference",117),
rep("Married Female Population Difference", 117),
rep("Percent Speak English at Home Difference",117),
rep("Foreign Born Difference",117),
rep("Per Capita Income Difference", 117))
allStates <- rep(c(rep("California",53), rep("Washington",10), rep("Texas",36), rep("Pennsylvania", 18)),16)
allCommission <- rep(c(rep("Independent", 63), rep("Partisan", 54)),16)
district <- rep(c(cali2012$DistrictNum, wash2012$DistrictNum, tx2012$DistrictNum, penn2012$DistrictNum),16)
allBoxDF <- data.frame(allData, allStates, allCommission, district, labels)
is_outlier <- function(x) {
return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
raceBoxDF %>%
group_by(labels, allCommission) %>%
mutate(outlier = ifelse(is_outlier(raceData), paste(allStates, as.character(district), sep = " "), "")) %>%
ggplot(., aes(x = labels, y = raceData, color = allCommission)) +
geom_boxplot() + geom_text(aes(label = outlier))

ggplot(raceBoxDF, aes(x = labels, y = raceData, color = allCommission)) +
geom_boxplot() + ggtitle("Race Differences by State") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5))

allOutlier <- allBoxDF %>%
group_by(labels, allCommission) %>%
mutate(outlier = ifelse(is_outlier(allData), paste(allStates, as.character(district), sep = " "), ""))
ggplot(allOutlier, aes(x = labels, y = allData)) + geom_boxplot(aes(fill = allCommission)) +
ggtitle("Demographic Congressional District Differences by District Drawing Method") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5)) + #geom_text_repel(aes(label = outlier)) +
facet_wrap(~ labels, scales = "free")

ggplot(allOutlier, aes(x = labels, y = allData)) + geom_boxplot(aes(fill = allCommission)) +
ggtitle("Demographic Congressional District Differences by District Drawing Method") + ylab("Absolute Difference") +
xlab("") + theme(plot.title = element_text(hjust = 0.5)) +
facet_wrap(~ labels, scales = "free")
onlyOutliers <- filter(allOutlier, outlier != "")
ggplot(onlyOutliers, aes(allStates)) + geom_bar()

outlierDistrictCount <- onlyOutliers %>%
group_by(outlier) %>%
summarise(n = n()) %>%
filter(n > 1) %>%
mutate(state= gsub('[[:digit:]]+', '', outlier))
ggplot(outlierDistrictCount, aes(outlier)) +
geom_bar(stat = 'identity', aes(y = n, fill=state)) +
ggtitle("Number of Variables District is an Outlier On") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5), plot.title = element_text(hjust = 0.5)) +
xlab("District") + ylab("Number of Outliers")

NA
totalOutlierCount <- allBoxDF %>%
group_by(labels, allStates) %>%
mutate(outlier = ifelse(is_outlier(allData), paste(allStates, as.character(district), sep = " "), "")) %>%
ungroup() %>%
filter(outlier != "") %>%
group_by(outlier) %>%
summarise(n = n()) %>%
filter(n > 3) %>%
mutate(state= gsub('[[:digit:]]+', '', outlier))
ggplot(totalOutlierCount, aes(outlier)) +
geom_bar(stat = 'identity', aes(y = n, fill=state)) +
ggtitle("Number of Variables District is an Outlier On (> 3)") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5), plot.title = element_text(hjust = 0.5)) +
xlab("District") + ylab("Number of Outliers")

stateOutlierProp <- allBoxDF %>%
group_by(labels, allCommission) %>%
mutate(outlier = ifelse(is_outlier(allData), paste(allStates, as.character(district), sep = " "), "")) %>%
summarise(percent_outlier = ((length(unique(outlier))-1)/n()))
ggplot(stateOutlierProp, aes(allCommission)) +
geom_bar(stat = 'identity', aes(y = percent_outlier, fill=allCommission)) +
ggtitle("Proportion of Districts are Outliers by District Drawing Commission") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5), plot.title = element_text(hjust = 0.5)) +
xlab("District") + ylab("Number of Outliers") + facet_wrap(~ labels, scales = "free")
Error: `predicate` must be a closure or function pointer
pennOutlierCount <- allOutlier %>%
filter(allStates == "Pennsylvania") %>%
group_by(district) %>%
summarise(times_outlier = sum(ifelse(outlier != "",1,0)))
outlier_pa <- tibble(DISTRICT=as.character(1:18),
Outliers = pennOutlierCount$times_outlier)
cd114_pa <- cd114_pa %>% left_join(outlier_pa, by="DISTRICT")
cd114_pa
Simple feature collection with 18 features and 2 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -80.51949 ymin: 39.7198 xmax: -74.68952 ymax: 42.26986
epsg (SRID): 4269
proj4string: +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
First 10 features:
DISTRICT Outliers geometry
1 1 5 MULTIPOLYGON (((-75.4183 39...
2 2 6 MULTIPOLYGON (((-75.34917 4...
3 3 0 MULTIPOLYGON (((-79.76195 4...
4 4 0 MULTIPOLYGON (((-77.47109 3...
5 5 2 MULTIPOLYGON (((-80.26614 4...
6 6 0 MULTIPOLYGON (((-76.47761 4...
7 7 0 MULTIPOLYGON (((-76.18406 4...
8 8 0 MULTIPOLYGON (((-75.55788 4...
9 9 0 MULTIPOLYGON (((-80.11704 3...
10 10 0 MULTIPOLYGON (((-77.91393 4...
devtools::install_github("tidyverse/ggplot2")
require(ggplot2)
dm <- get_map(location="Washington", zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=Washington&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
Source : https://maps.googleapis.com/maps/api/geocode/json?address=Washington&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
geocode failed with status REQUEST_DENIED, location = "Washington"Error in data.frame(ll.lat = ll[1], ll.lon = ll[2], ur.lat = ur[1], ur.lon = ur[2]) :
arguments imply differing number of rows: 0, 1
map<-get_map(location = c(-77.1945,41.2033), zoom=7)
Source : https://maps.googleapis.com/maps/api/staticmap?center=41.2033,-77.1945&zoom=7&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map) +
geom_sf(data=cd114_pa,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

washOutlierCount <- allOutlier %>%
filter(allStates == "Washington") %>%
group_by(district) %>%
summarise(times_outlier = sum(ifelse(outlier != "",1,0)))
cd114_wa <- cd114 %>%
filter(STATENAME=="Washington") %>%
mutate(DISTRICT = as.character(DISTRICT)) %>%
select(DISTRICT)
outlier_wa <- tibble(DISTRICT=as.character(1:10),
Outliers = washOutlierCount$times_outlier)
cd114_wa <- cd114_wa %>% left_join(outlier_wa, by="DISTRICT")
map<-get_map(location = c(-120.7401,47.7511), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=47.7511,-120.7401&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map) +
geom_sf(data=cd114_wa,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

txOutlierCount <- allOutlier %>%
filter(allStates == "Texas") %>%
group_by(district) %>%
summarise(times_outlier = sum(ifelse(outlier != "",1,0)))
cd114_tx <- cd114 %>%
filter(STATENAME=="Texas") %>%
mutate(DISTRICT = as.character(DISTRICT)) %>%
select(DISTRICT)
outlier_tx <- tibble(DISTRICT=as.character(1:36),
Outliers = txOutlierCount$times_outlier)
cd114_tx <- cd114_tx %>% left_join(outlier_tx, by="DISTRICT")
map<-get_map(location = c(-99.9018,31.9689), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=31.9689,-99.9018&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map) +
geom_sf(data=cd114_tx,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

caOutlierCount <- allOutlier %>%
filter(allStates == "California") %>%
group_by(district) %>%
summarise(times_outlier = sum(ifelse(outlier != "",1,0)))
cd114_ca <- cd114 %>%
filter(STATENAME=="California") %>%
mutate(DISTRICT = as.character(DISTRICT)) %>%
select(DISTRICT)
outlier_ca <- tibble(DISTRICT=as.character(1:53),
Outliers = caOutlierCount$times_outlier)
cd114_ca <- cd114_ca %>% left_join(outlier_ca, by="DISTRICT")
map<-get_map(location = c(-119.4179,36.7783), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=36.7783,-119.4179&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map) +
geom_sf(data=cd114_ca,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

map_pa<-get_map(location = c(-77.1945,41.2033), zoom=7)
Source : https://maps.googleapis.com/maps/api/staticmap?center=41.2033,-77.1945&zoom=7&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
map_wa<-get_map(location = c(-120.7401,47.7511), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=47.7511,-120.7401&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
map_tx<-get_map(location = c(-99.9018,31.9689), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=31.9689,-99.9018&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
map_ca<-get_map(location = c(-119.4179,36.7783), zoom=6)
Source : https://maps.googleapis.com/maps/api/staticmap?center=36.7783,-119.4179&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
voteshare_pa <- tibble(DISTRICT=as.character(1:18),
`Average D Voteshare` = filter(avg_votes, State == "Pennsylvania")$Average)
cd114_vote_pa <- cd114_pa %>% left_join(voteshare_pa, by="DISTRICT")
ggmap(map_pa) +
geom_sf(data=cd114_vote_pa,aes(fill=Voteshare),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "red", high = "blue", limits=c(0,1)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

voteshare_wa <- tibble(DISTRICT=as.character(1:10),
`Average D Voteshare` = filter(avg_votes, State == "Washington")$Average)
cd114_vote_wa <- cd114_wa %>% left_join(voteshare_wa, by="DISTRICT")
ggmap(map_wa) +
geom_sf(data=cd114_vote_wa,aes(fill=Voteshare),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "red", high = "blue", limits=c(0,1)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

voteshare_ca <- tibble(DISTRICT=as.character(1:53),
`Average D Voteshare` = filter(avg_votes, State == "California")$Average)
cd114_vote_ca <- cd114_ca %>% left_join(voteshare_ca, by="DISTRICT")
ggmap(map_ca) +
geom_sf(data=cd114_vote_ca,aes(fill=Voteshare),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "red", high = "blue", limits=c(0,1)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

voteshare_tx <- tibble(DISTRICT=as.character(1:36),
`Average D Voteshare` = filter(avg_votes, State == "Texas")$Average)
cd114_vote_tx <- cd114_tx %>% left_join(voteshare_tx, by="DISTRICT")
ggmap(map_tx) +
geom_sf(data=cd114_vote_tx,aes(fill=`Average D Voteshare`),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "red", high = "blue", limits=c(0,1)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

map_philly <- get_map(c(-75.1652,39.9526), zoom=9)
Source : https://maps.googleapis.com/maps/api/staticmap?center=39.9526,-75.1652&zoom=9&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map_philly) +
geom_sf(data=cd114_pa,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

map_la <- get_map(c(-118.2437,34.0522), zoom=8)
Source : https://maps.googleapis.com/maps/api/staticmap?center=34.0522,-118.2437&zoom=8&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map_la) +
geom_sf(data=cd114_ca,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

map_dallas <- get_map(c(-96.7970,32.7767), zoom=7)
Source : https://maps.googleapis.com/maps/api/staticmap?center=32.7767,-96.797&zoom=7&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map_dallas) +
geom_sf(data=cd114_tx,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

map_hou <- get_map(c(-95.3698,29.7604), zoom=8)
Source : https://maps.googleapis.com/maps/api/staticmap?center=29.7604,-95.3698&zoom=8&size=640x640&scale=2&maptype=terrain&language=en-EN&key=AIzaSyAcFP4aqbKzzeaBtK9xdyUsX3Lwam9zDAA
ggmap(map_hou) +
geom_sf(data=cd114_tx,aes(fill=Outliers),inherit.aes=FALSE,alpha=0.9) +
scale_fill_gradient(low = "green", high = "red", limits=c(0,7)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

LS0tDQp0aXRsZTogIlNlbmlvciBEZXNpZ24iDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NCg0KDQpgYGB7cn0NCnR3ZWx2ZSA8LSByZWFkLmNzdigiQzovVXNlcnMvZmFybGNfMDAwL0RvY3VtZW50cy8yMDEyLmNzdiIpDQpmb3VydGVlbiA8LSByZWFkLmNzdigiQzovVXNlcnMvZmFybGNfMDAwL0RvY3VtZW50cy8yMDE0LmNzdiIpDQpzaXh0ZWVuIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9mYXJsY18wMDAvRG9jdW1lbnRzLzIwMTYuY3N2IikNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpsaWJyYXJ5KGNhcmV0KQ0KYGBgDQoNCmBgYHtyfQ0KZml0MTYgPSByYW5kb21Gb3Jlc3QoZGF0YSA9IHNpeHRlZW5bLC0oMTo0KV0sIERlbW9jcmF0aWNUd29QYXJ0eVZvdGVzaGFyZSB+LikNCg0KdmFySW1wUGxvdChmaXQxNiwgdHlwZT0yKQ0KVkkgPC0gaW1wb3J0YW5jZShmaXQxNikNCndyaXRlLmNzdihWSSwgZmlsZSA9ICJWSTE2LmNzdiIsIHJvdy5uYW1lcyA9IFQpDQpgYGAgDQoNCmBgYHtyfQ0Kc29ydGVkIDwtIHJlYWQuY3N2KCJWSTE2LmNzdiIpDQpiYXJwbG90KHNvcnRlZCRJbmNOb2RlUHVyaXR5WzE6MTVdLCBob3JpeiA9IFQsIG5hbWVzLmFyZyA9IHNvcnRlZCRWYXJbMToxNV0pDQpgYGANCg0KYGBge3J9DQpmaXQxMiA9IHJhbmRvbUZvcmVzdChkYXRhID0gdHdlbHZlWywtKDE6NCldLCBEZW1vY3JhdGljVHdvUGFydHlWb3Rlc2hhcmUgfi4pDQoNCnZhckltcFBsb3QoZml0MTIsIHR5cGU9MikNCg0KVkkgPC0gaW1wb3J0YW5jZShmaXQxMikNCndyaXRlLmNzdihWSSwgZmlsZSA9ICJWSTEyLmNzdiIsIHJvdy5uYW1lcyA9IFQpDQpgYGANCg0KYGBge3J9DQpmaXQxNCA9IHJhbmRvbUZvcmVzdChkYXRhID0gZm91cnRlZW5bLC0oMTo0KV0sIERlbW9jcmF0aWNUd29QYXJ0eVZvdGVzaGFyZSB+LikNCg0KdmFySW1wUGxvdChmaXQxNCwgdHlwZT0yKQ0KDQpWSSA8LSBpbXBvcnRhbmNlKGZpdDE0KQ0Kd3JpdGUuY3N2KFZJLCBmaWxlID0gIlZJMTQuY3N2Iiwgcm93Lm5hbWVzID0gVCkNCmBgYA0KDQpgYGB7cn0NCmRhdGExNDE2IDwtIHJiaW5kKGZvdXJ0ZWVuLCBzaXh0ZWVuKQ0KQWxsRGF0YSA8LSByYmluZCh0d2VsdmUsIGRhdGExNDE2KQ0KYGBgDQoNCmBgYHtyfQ0KWCA8LSBzcGxpdChBbGxEYXRhLCBBbGxEYXRhJFgpDQpjYWxpIDwtIFhbWzFdXQ0KcGVubiA8LSBYW1syXV0NCnR4IDwtIFhbWzNdXQ0Kd2FzaCA8LSBYW1s0XV0NCmBgYA0KDQpgYGB7cn0NCg0KYGBgDQoNCmBgYHtyfQ0KZml0Y2FsaSA8LSByYW5kb21Gb3Jlc3QoZGF0YSA9IGNhbGlbLC0oMTo0KV0sIERlbW9jcmF0aWNUd29QYXJ0eVZvdGVzaGFyZSB+LikNCg0KdmFySW1wUGxvdChmaXRjYWxpLCB0eXBlID0gMikNCmBgYA0KDQpgYGB7cn0NCmZpdHdhc2ggPC0gcmFuZG9tRm9yZXN0KGRhdGEgPSB3YXNoWywtKDE6NCldLCBEZW1vY3JhdGljVHdvUGFydHlWb3Rlc2hhcmUgfi4pDQoNCnZhckltcFBsb3QoZml0d2FzaCwgdHlwZSA9IDIpDQpgYGANCg0KYGBge3J9DQpmaXR0eCA8LSByYW5kb21Gb3Jlc3QoZGF0YSA9IHR4WywtKDE6NCldLCBEZW1vY3JhdGljVHdvUGFydHlWb3Rlc2hhcmUgfi4pDQoNCnZhckltcFBsb3QoZml0dHgsIHR5cGUgPSAyKQ0KYGBgDQoNCmBgYHtyfQ0KZml0cGVubiA8LSByYW5kb21Gb3Jlc3QoZGF0YSA9IHBlbm5bLC0oMTo0KV0sIERlbW9jcmF0aWNUd29QYXJ0eVZvdGVzaGFyZSB+LikNCg0KdmFySW1wUGxvdChmaXRwZW5uLCB0eXBlID0gMikNCmBgYA0KDQpgYGB7cn0NClZJIDwtIGltcG9ydGFuY2UoZml0cGVubikNCndyaXRlLmNzdihWSSwgZmlsZSA9ICJWSVBBLmNzdiIsIHJvdy5uYW1lcyA9IFQpDQpWSSA8LSBpbXBvcnRhbmNlKGZpdHR4KQ0Kd3JpdGUuY3N2KFZJLCBmaWxlID0gIlZJVFguY3N2Iiwgcm93Lm5hbWVzID0gVCkNClZJIDwtIGltcG9ydGFuY2UoZml0d2FzaCkNCndyaXRlLmNzdihWSSwgZmlsZSA9ICJWSVdBLmNzdiIsIHJvdy5uYW1lcyA9IFQpDQpWSSA8LSBpbXBvcnRhbmNlKGZpdGNhbGkpDQp3cml0ZS5jc3YoVkksIGZpbGUgPSAiVklDQS5jc3YiLCByb3cubmFtZXMgPSBUKQ0KYGBgDQoNCmBgYHtyfQ0KV0FuZWlnaGJvciA8LSByZWFkLmNzdigifi9TZW5pb3IgWWVhci9TZW5pb3IgRGVzaWduL1dhc2hpbmd0b24gTmVpZ2hib3JzLmNzdiIsIGhlYWRlciA9IFQsIHJvdy5uYW1lcyA9IDEpDQpQQW5laWdoYm9yIDwtIHJlYWQuY3N2KCJ+L1NlbmlvciBZZWFyL1NlbmlvciBEZXNpZ24vUGVubnN5bHZhbmlhIE5laWdoYm9ycy5jc3YiLCBoZWFkZXIgPSBULCByb3cubmFtZXMgPSAxKQ0KVFhuZWlnaGJvciA8LSByZWFkLmNzdigifi9TZW5pb3IgWWVhci9TZW5pb3IgRGVzaWduL1RleGFzIE5laWdoYm9ycyB2Mi5jc3YiLCBoZWFkZXIgPSBULCByb3cubmFtZXMgPSAxKQ0KQ0FuZWlnaGJvciA8LSByZWFkLmNzdigifi9TZW5pb3IgWWVhci9TZW5pb3IgRGVzaWduL0NhbGlmb3JuaWEgTmVpZ2hib3JzLmNzdiIsIGhlYWRlciA9IFQsIHJvdy5uYW1lcyA9IDEpDQpgYGANCg0KYGBge3J9DQpjYWxpJERpc3RyaWN0TnVtIDwtIGNhbGkkR0VPLmlkMiAtIDYwMA0Kd2FzaCREaXN0cmljdE51bSA8LSB3YXNoJEdFTy5pZDIgLSA1MzAwDQpwZW5uJERpc3RyaWN0TnVtIDwtIHBlbm4kR0VPLmlkMiAtIDQyMDANCnR4JERpc3RyaWN0TnVtIDwtIHR4JEdFTy5pZDIgLSA0ODAwDQpjYWxpMjAxMiA8LSBjYWxpWygxOjUzKSxdDQp3YXNoMjAxMiA8LSB3YXNoWygxOjEwKSxdDQpwZW5uMjAxMiA8LSBwZW5uWygxOjE4KSxdDQp0eDIwMTIgPC0gdHhbKDE6MzYpLF0NCmBgYA0KDQpgYGB7cn0NCm5laWdoYm9yZGlmZmVyZW5jZSA8LSBmdW5jdGlvbihkaXN0cmljdCwgZGVtbywgbmVpZ2hib3IpeyAjYXNzdW1lcyBib3RoIGFyZSB2ZWN0b3JzIG9mIGVxdWFsIHNpemUNCiAgbiA8LSBzdW0obmVpZ2hib3IpDQogIG5icnNkZW0gPC0gZGVtb1t3aGljaChuZWlnaGJvcildDQogIGRpZmZlcmVuY2VzIDwtIGFicyhkZW1vW2Rpc3RyaWN0XSAtIG5icnNkZW0pDQogIG5laWdoYm9yZGlmZmVyZW5jZSA8LSBzdW0oZGlmZmVyZW5jZXMpIC8gbg0KfQ0KDQpudW1fZGlzdHJpY3RzIDwtIGxlbmd0aChjYWxpMjAxMiRHRU8uaWQpDQoNCmFnZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp2ZXRkaWZmZXJlbmNlc0NBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmJsYWNrZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQppbmNvbWVkaWZmZXJlbmNlc0NBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmZvcmVpZ25kaWZmZXJlbmNlc0NBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnVuZW1wZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp5b3VuZ2RpZmZlcmVuY2VzQ0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0Kc29tZWNvbGxlZ2VkaWZmZXJlbmNlc0NBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCndoaXRlZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp0d29yYWNlZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQplbGRlcmx5ZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp0cmFkZWRpZmZlcmVuY2VzQ0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZW5nbGlzaGRpZmZlcmVuY2VzQ0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KbWFycmllZGRpZmZlcmVuY2VzQ0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KaGlzcGFuaWNkaWZmZXJlbmNlc0NBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmVucm9sbGVkZGlmZmVyZW5jZXNDQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQoNCmZvciAoaSBpbiAxOm51bV9kaXN0cmljdHMpew0KICBhZ2RpZmZlcmVuY2VzQ0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIGNhbGkyMDEyJEhDMDNfRUM1MCwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgdmV0ZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19TQzEwMSwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgYmxhY2tkaWZmZXJlbmNlc0NBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBjYWxpMjAxMiRIQzAzX0RIOTUsIHVubmFtZShDQW5laWdoYm9yWyxpXSkpDQogIGluY29tZWRpZmZlcmVuY2VzQ0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIGNhbGkyMDEyJEhDMDFfRUMxMTgsIHVubmFtZShDQW5laWdoYm9yWyxpXSkpDQogIGZvcmVpZ25kaWZmZXJlbmNlc0NBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBjYWxpMjAxMiRIQzAzX1NDMTQwLCB1bm5hbWUoQ0FuZWlnaGJvclssaV0pKQ0KICB1bmVtcGRpZmZlcmVuY2VzQ0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIGNhbGkyMDEyJEhDMDNfRUMxMiwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgeW91bmdkaWZmZXJlbmNlc0NBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBjYWxpMjAxMiRIQzAzX0VTVF9BU0IwMiwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgc29tZWNvbGxlZ2VkaWZmZXJlbmNlc0NBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBjYWxpMjAxMiRIQzAzX1NDODksIHVubmFtZShDQW5laWdoYm9yWyxpXSkpDQogIHdoaXRlZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19ESDk0LCB1bm5hbWUoQ0FuZWlnaGJvclssaV0pKQ0KICB0d29yYWNlZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19TQzEwMSwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgZWxkZXJseWRpZmZlcmVuY2VzQ0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIGNhbGkyMDEyJEhDMDNfREgxMDIsIHVubmFtZShDQW5laWdoYm9yWyxpXSkpDQogIHRyYWRlZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19FQzUzLCB1bm5hbWUoQ0FuZWlnaGJvclssaV0pKQ0KICBlbmdsaXNoZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19TQzE3MSwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgbWFycmllZGRpZmZlcmVuY2VzQ0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIGNhbGkyMDEyJEhDMDNfU0M0NSwgdW5uYW1lKENBbmVpZ2hib3JbLGldKSkNCiAgaGlzcGFuaWNkaWZmZXJlbmNlc0NBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBjYWxpMjAxMiRIQzAzX0RIODgsIHVubmFtZShDQW5laWdoYm9yWyxpXSkpDQogIGVucm9sbGVkZGlmZmVyZW5jZXNDQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgY2FsaTIwMTIkSEMwM19TQzgxLCB1bm5hbWUoQ0FuZWlnaGJvclssaV0pKQ0KDQp9DQoNCm51bV9kaXN0cmljdHMgPC0gbGVuZ3RoKHdhc2gyMDEyJERpc3RyaWN0TnVtKQ0KYWdkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnZldGRpZmZlcmVuY2VzV0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KYmxhY2tkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmluY29tZWRpZmZlcmVuY2VzV0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZm9yZWlnbmRpZmZlcmVuY2VzV0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KdW5lbXBkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnlvdW5nZGlmZmVyZW5jZXNXQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpzb21lY29sbGVnZWRpZmZlcmVuY2VzV0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0Kd2hpdGVkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnR3b3JhY2VkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmVsZGVybHlkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnRyYWRlZGlmZmVyZW5jZXNXQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQplbmdsaXNoZGlmZmVyZW5jZXNXQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQptYXJyaWVkZGlmZmVyZW5jZXNXQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpoaXNwYW5pY2RpZmZlcmVuY2VzV0EgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZW5yb2xsZWRkaWZmZXJlbmNlc1dBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCg0KZm9yIChpIGluIDE6bnVtX2Rpc3RyaWN0cyl7DQogIGFnZGlmZmVyZW5jZXNXQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgd2FzaDIwMTIkSEMwM19FQzUwLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICB2ZXRkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX1NDMTAxLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICBibGFja2RpZmZlcmVuY2VzV0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHdhc2gyMDEyJEhDMDNfREg5NSwgdW5uYW1lKFdBbmVpZ2hib3JbLGldKSkNCiAgaW5jb21lZGlmZmVyZW5jZXNXQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgd2FzaDIwMTIkSEMwMV9FQzExOCwgdW5uYW1lKFdBbmVpZ2hib3JbLGldKSkNCiAgZm9yZWlnbmRpZmZlcmVuY2VzV0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHdhc2gyMDEyJEhDMDNfU0MxNDAsIHVubmFtZShXQW5laWdoYm9yWyxpXSkpDQogIHVuZW1wZGlmZmVyZW5jZXNXQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgd2FzaDIwMTIkSEMwM19FQzEyLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICB5b3VuZ2RpZmZlcmVuY2VzV0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHdhc2gyMDEyJEhDMDNfRVNUX0FTQjAyLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICBzb21lY29sbGVnZWRpZmZlcmVuY2VzV0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHdhc2gyMDEyJEhDMDNfU0M4OSwgdW5uYW1lKFdBbmVpZ2hib3JbLGldKSkNCiAgd2hpdGVkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX0RIOTQsIHVubmFtZShXQW5laWdoYm9yWyxpXSkpDQogIHR3b3JhY2VkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX1NDMTAxLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICBlbGRlcmx5ZGlmZmVyZW5jZXNXQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgd2FzaDIwMTIkSEMwM19ESDEwMiwgdW5uYW1lKFdBbmVpZ2hib3JbLGldKSkNCiAgdHJhZGVkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX0VDNTMsIHVubmFtZShXQW5laWdoYm9yWyxpXSkpDQogIGVuZ2xpc2hkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX1NDMTcxLCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICBtYXJyaWVkZGlmZmVyZW5jZXNXQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgd2FzaDIwMTIkSEMwM19TQzQ1LCB1bm5hbWUoV0FuZWlnaGJvclssaV0pKQ0KICBoaXNwYW5pY2RpZmZlcmVuY2VzV0FbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHdhc2gyMDEyJEhDMDNfREg4OCwgdW5uYW1lKFdBbmVpZ2hib3JbLGldKSkNCiAgZW5yb2xsZWRkaWZmZXJlbmNlc1dBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB3YXNoMjAxMiRIQzAzX1NDODEsIHVubmFtZShXQW5laWdoYm9yWyxpXSkpDQoNCn0NCg0KbnVtX2Rpc3RyaWN0cyA8LSBsZW5ndGgocGVubjIwMTIkRGlzdHJpY3ROdW0pDQphZ2RpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KdmV0ZGlmZmVyZW5jZXNQQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpibGFja2RpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KaW5jb21lZGlmZmVyZW5jZXNQQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpmb3JlaWduZGlmZmVyZW5jZXNQQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp1bmVtcGRpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KeW91bmdkaWZmZXJlbmNlc1BBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnNvbWVjb2xsZWdlZGlmZmVyZW5jZXNQQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQp3aGl0ZWRpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KdHdvcmFjZWRpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZWxkZXJseWRpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KdHJhZGVkaWZmZXJlbmNlc1BBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmVuZ2xpc2hkaWZmZXJlbmNlc1BBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCm1hcnJpZWRkaWZmZXJlbmNlc1BBIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmhpc3BhbmljZGlmZmVyZW5jZXNQQSA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQplbnJvbGxlZGRpZmZlcmVuY2VzUEEgPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KDQpmb3IgKGkgaW4gMTpudW1fZGlzdHJpY3RzKXsNCiAgYWdkaWZmZXJlbmNlc1BBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBwZW5uMjAxMiRIQzAzX0VDNTAsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIHZldGRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfU0MxMDEsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIGJsYWNrZGlmZmVyZW5jZXNQQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgcGVubjIwMTIkSEMwM19ESDk1LCB1bm5hbWUoUEFuZWlnaGJvclssaV0pKQ0KICBpbmNvbWVkaWZmZXJlbmNlc1BBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBwZW5uMjAxMiRIQzAxX0VDMTE4LCB1bm5hbWUoUEFuZWlnaGJvclssaV0pKQ0KICBmb3JlaWduZGlmZmVyZW5jZXNQQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgcGVubjIwMTIkSEMwM19TQzE0MCwgdW5uYW1lKFBBbmVpZ2hib3JbLGldKSkNCiAgdW5lbXBkaWZmZXJlbmNlc1BBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBwZW5uMjAxMiRIQzAzX0VDMTIsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIHlvdW5nZGlmZmVyZW5jZXNQQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgcGVubjIwMTIkSEMwM19FU1RfQVNCMDIsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIHNvbWVjb2xsZWdlZGlmZmVyZW5jZXNQQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgcGVubjIwMTIkSEMwM19TQzg5LCB1bm5hbWUoUEFuZWlnaGJvclssaV0pKQ0KICB3aGl0ZWRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfREg5NCwgdW5uYW1lKFBBbmVpZ2hib3JbLGldKSkNCiAgdHdvcmFjZWRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfU0MxMDEsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIGVsZGVybHlkaWZmZXJlbmNlc1BBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBwZW5uMjAxMiRIQzAzX0RIMTAyLCB1bm5hbWUoUEFuZWlnaGJvclssaV0pKQ0KICB0cmFkZWRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfRUM1MywgdW5uYW1lKFBBbmVpZ2hib3JbLGldKSkNCiAgZW5nbGlzaGRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfU0MxNzEsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIG1hcnJpZWRkaWZmZXJlbmNlc1BBW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCBwZW5uMjAxMiRIQzAzX1NDNDUsIHVubmFtZShQQW5laWdoYm9yWyxpXSkpDQogIGhpc3BhbmljZGlmZmVyZW5jZXNQQVtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgcGVubjIwMTIkSEMwM19ESDg4LCB1bm5hbWUoUEFuZWlnaGJvclssaV0pKQ0KICBlbnJvbGxlZGRpZmZlcmVuY2VzUEFbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHBlbm4yMDEyJEhDMDNfU0M4MSwgdW5uYW1lKFBBbmVpZ2hib3JbLGldKSkNCn0NCg0KbnVtX2Rpc3RyaWN0cyA8LSBsZW5ndGgodHgyMDEyJERpc3RyaWN0TnVtKQ0KYWdkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnZldGRpZmZlcmVuY2VzVFggPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KYmxhY2tkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmluY29tZWRpZmZlcmVuY2VzVFggPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZm9yZWlnbmRpZmZlcmVuY2VzVFggPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KdW5lbXBkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnlvdW5nZGlmZmVyZW5jZXNUWCA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpzb21lY29sbGVnZWRpZmZlcmVuY2VzVFggPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0Kd2hpdGVkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnR3b3JhY2VkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCmVsZGVybHlkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCnRyYWRlZGlmZmVyZW5jZXNUWCA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQplbmdsaXNoZGlmZmVyZW5jZXNUWCA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQptYXJyaWVkZGlmZmVyZW5jZXNUWCA8LSByZXAoTkEsIG51bV9kaXN0cmljdHMpDQpoaXNwYW5pY2RpZmZlcmVuY2VzVFggPC0gcmVwKE5BLCBudW1fZGlzdHJpY3RzKQ0KZW5yb2xsZWRkaWZmZXJlbmNlc1RYIDwtIHJlcChOQSwgbnVtX2Rpc3RyaWN0cykNCg0KDQpmb3IgKGkgaW4gMTpudW1fZGlzdHJpY3RzKXsNCiAgYWdkaWZmZXJlbmNlc1RYW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB0eDIwMTIkSEMwM19FQzUwLCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICB2ZXRkaWZmZXJlbmNlc1RYW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB0eDIwMTIkSEMwM19TQzEwMSwgdW5uYW1lKFRYbmVpZ2hib3JbLGldKSkNCiAgYmxhY2tkaWZmZXJlbmNlc1RYW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB0eDIwMTIkSEMwM19ESDk1LCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICBpbmNvbWVkaWZmZXJlbmNlc1RYW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB0eDIwMTIkSEMwMV9FQzExOCwgdW5uYW1lKFRYbmVpZ2hib3JbLGldKSkNCiAgZm9yZWlnbmRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX1NDMTQwLCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICB1bmVtcGRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX0VDMTIsIHVubmFtZShUWG5laWdoYm9yWyxpXSkpDQogIHlvdW5nZGlmZmVyZW5jZXNUWFtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgdHgyMDEyJEhDMDNfRVNUX0FTQjAyLCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICBzb21lY29sbGVnZWRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX1NDODksIHVubmFtZShUWG5laWdoYm9yWyxpXSkpDQogIHdoaXRlZGlmZmVyZW5jZXNUWFtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgdHgyMDEyJEhDMDNfREg5NCwgdW5uYW1lKFRYbmVpZ2hib3JbLGldKSkNCiAgdHdvcmFjZWRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX1NDMTAxLCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICBlbGRlcmx5ZGlmZmVyZW5jZXNUWFtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgdHgyMDEyJEhDMDNfREgxMDIsIHVubmFtZShUWG5laWdoYm9yWyxpXSkpDQogIHRyYWRlZGlmZmVyZW5jZXNUWFtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgdHgyMDEyJEhDMDNfRUM1MywgdW5uYW1lKFRYbmVpZ2hib3JbLGldKSkNCiAgZW5nbGlzaGRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX1NDMTcxLCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICBtYXJyaWVkZGlmZmVyZW5jZXNUWFtpXSA8LSBuZWlnaGJvcmRpZmZlcmVuY2UoaSwgdHgyMDEyJEhDMDNfU0M0NSwgdW5uYW1lKFRYbmVpZ2hib3JbLGldKSkNCiAgaGlzcGFuaWNkaWZmZXJlbmNlc1RYW2ldIDwtIG5laWdoYm9yZGlmZmVyZW5jZShpLCB0eDIwMTIkSEMwM19ESDg4LCB1bm5hbWUoVFhuZWlnaGJvclssaV0pKQ0KICBlbnJvbGxlZGRpZmZlcmVuY2VzVFhbaV0gPC0gbmVpZ2hib3JkaWZmZXJlbmNlKGksIHR4MjAxMiRIQzAzX1NDODEsIHVubmFtZShUWG5laWdoYm9yWyxpXSkpDQp9DQoNCmFnY29uZkNBIDwtIHQudGVzdChhZ2RpZmZlcmVuY2VzQ0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KYWdjb25mV0EgPC0gdC50ZXN0KGFnZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQphZ2NvbmZQQSA8LSB0LnRlc3QoYWdkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmFnY29uZlRYIDwtIHQudGVzdChhZ2RpZmZlcmVuY2VzVFgsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KbWVhbnMgPC0gYyhtZWFuKGFnZGlmZmVyZW5jZXNDQSksIG1lYW4oYWdkaWZmZXJlbmNlc1dBKSwgbWVhbihhZ2RpZmZlcmVuY2VzUEEpLCBtZWFuKGFnZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIlBlcmNlbnRhZ2Ugb2YgQWdyaWN1bHR1cmUgV29ya2VycyIsIDQpDQpsb3dlcmNvbmYgPC0gYyhhZ2NvbmZDQVsxXSwgYWdjb25mV0FbMV0sIGFnY29uZlBBWzFdLCBhZ2NvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKGFnY29uZkNBWzJdLCBhZ2NvbmZXQVsyXSwgYWdjb25mUEFbMl0sIGFnY29uZlRYWzJdKQ0KYWdkZiA8LSBkYXRhLmZyYW1lKHN0YXRlcywgbWVhbnMsIGxvd2VyY29uZiwgdXBwZXJjb25mLCBsYWJlbCkNCg0KdmV0Y29uZkNBIDwtIHQudGVzdCh2ZXRkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCnZldGNvbmZXQSA8LSB0LnRlc3QodmV0ZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp2ZXRjb25mUEEgPC0gdC50ZXN0KHZldGRpZmZlcmVuY2VzUEEsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KdmV0Y29uZlRYIDwtIHQudGVzdCh2ZXRkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbih2ZXRkaWZmZXJlbmNlc0NBKSwgbWVhbih2ZXRkaWZmZXJlbmNlc1dBKSwgbWVhbih2ZXRkaWZmZXJlbmNlc1BBKSwgbWVhbih2ZXRkaWZmZXJlbmNlc1RYKSkNCnN0YXRlcyA8LSBjKCJDYWxpZm9ybmlhIiwgIldhc2hpbmd0b24iLCAiUGVubnN5bHZhbmlhIiwgIlRleGFzIikNCmxhYmVsIDwtIHJlcCgiUGVyY2VudGFnZSBvZiBWZXRlcmFucyIsIDQpDQpsb3dlcmNvbmYgPC0gYyh2ZXRjb25mQ0FbMV0sIHZldGNvbmZXQVsxXSwgdmV0Y29uZlBBWzFdLCB2ZXRjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyh2ZXRjb25mQ0FbMl0sIHZldGNvbmZXQVsyXSwgdmV0Y29uZlBBWzJdLCB2ZXRjb25mVFhbMl0pDQp2ZXRkZiA8LSBkYXRhLmZyYW1lKHN0YXRlcywgbWVhbnMsIGxvd2VyY29uZiwgdXBwZXJjb25mLCBsYWJlbCkNCg0KYmxhY2tjb25mQ0EgPC0gdC50ZXN0KGJsYWNrZGlmZmVyZW5jZXNDQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQpibGFja2NvbmZXQSA8LSB0LnRlc3QoYmxhY2tkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmJsYWNrY29uZlBBIDwtIHQudGVzdChibGFja2RpZmZlcmVuY2VzUEEsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KYmxhY2tjb25mVFggPC0gdC50ZXN0KGJsYWNrZGlmZmVyZW5jZXNUWCwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQptZWFucyA8LSBjKG1lYW4oYmxhY2tkaWZmZXJlbmNlc0NBKSwgbWVhbihibGFja2RpZmZlcmVuY2VzV0EpLCBtZWFuKGJsYWNrZGlmZmVyZW5jZXNQQSksIG1lYW4oYmxhY2tkaWZmZXJlbmNlc1RYKSkNCnN0YXRlcyA8LSBjKCJDYWxpZm9ybmlhIiwgIldhc2hpbmd0b24iLCAiUGVubnN5bHZhbmlhIiwgIlRleGFzIikNCmxhYmVsIDwtIHJlcCgiRGlmZmVyZW5jZSBpbiBQZXJjZW50YWdlIFBvcHVsYXRpb24gQmxhY2siLCA0KQ0KbG93ZXJjb25mIDwtIGMoYmxhY2tjb25mQ0FbMV0sIGJsYWNrY29uZldBWzFdLCBibGFja2NvbmZQQVsxXSwgYmxhY2tjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyhibGFja2NvbmZDQVsyXSwgYmxhY2tjb25mV0FbMl0sIGJsYWNrY29uZlBBWzJdLCBibGFja2NvbmZUWFsyXSkNCmJsYWNrZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCmluY29tZWNvbmZDQSA8LSB0LnRlc3QoaW5jb21lZGlmZmVyZW5jZXNDQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQppbmNvbWVjb25mV0EgPC0gdC50ZXN0KGluY29tZWRpZmZlcmVuY2VzV0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KaW5jb21lY29uZlBBIDwtIHQudGVzdChpbmNvbWVkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmluY29tZWNvbmZUWCA8LSB0LnRlc3QoaW5jb21lZGlmZmVyZW5jZXNUWCwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQptZWFucyA8LSBjKG1lYW4oaW5jb21lZGlmZmVyZW5jZXNDQSksIG1lYW4oaW5jb21lZGlmZmVyZW5jZXNXQSksIG1lYW4oaW5jb21lZGlmZmVyZW5jZXNQQSksIG1lYW4oaW5jb21lZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIlBlciBDYXBpdGEgSW5jb21lIERpZmZlcmVuY2UiLCA0KQ0KbG93ZXJjb25mIDwtIGMoaW5jb21lY29uZkNBWzFdLCBpbmNvbWVjb25mV0FbMV0sIGluY29tZWNvbmZQQVsxXSwgaW5jb21lY29uZlRYWzFdKQ0KdXBwZXJjb25mIDwtIGMoaW5jb21lY29uZkNBWzJdLCBpbmNvbWVjb25mV0FbMl0sIGluY29tZWNvbmZQQVsyXSwgaW5jb21lY29uZlRYWzJdKQ0KaW5jb21lZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCmZvcmVpZ25jb25mQ0EgPC0gdC50ZXN0KGZvcmVpZ25kaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmZvcmVpZ25jb25mV0EgPC0gdC50ZXN0KGZvcmVpZ25kaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmZvcmVpZ25jb25mUEEgPC0gdC50ZXN0KGZvcmVpZ25kaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmZvcmVpZ25jb25mVFggPC0gdC50ZXN0KGZvcmVpZ25kaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihmb3JlaWduZGlmZmVyZW5jZXNDQSksIG1lYW4oZm9yZWlnbmRpZmZlcmVuY2VzV0EpLCBtZWFuKGZvcmVpZ25kaWZmZXJlbmNlc1BBKSwgbWVhbihmb3JlaWduZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIkRpZmZlcmVuY2UgaW4gUGVyY2VudGFnZSBGb3JlaWduIEJvcm4iLCA0KQ0KbG93ZXJjb25mIDwtIGMoZm9yZWlnbmNvbmZDQVsxXSwgZm9yZWlnbmNvbmZXQVsxXSwgZm9yZWlnbmNvbmZQQVsxXSwgZm9yZWlnbmNvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKGZvcmVpZ25jb25mQ0FbMl0sIGZvcmVpZ25jb25mV0FbMl0sIGZvcmVpZ25jb25mUEFbMl0sIGZvcmVpZ25jb25mVFhbMl0pDQpmb3JlaWduZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCnVuZW1wY29uZkNBIDwtIHQudGVzdCh1bmVtcGRpZmZlcmVuY2VzQ0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KdW5lbXBjb25mV0EgPC0gdC50ZXN0KHVuZW1wZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp1bmVtcGNvbmZQQSA8LSB0LnRlc3QodW5lbXBkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCnVuZW1wY29uZlRYIDwtIHQudGVzdCh1bmVtcGRpZmZlcmVuY2VzVFgsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KbWVhbnMgPC0gYyhtZWFuKHVuZW1wZGlmZmVyZW5jZXNDQSksIG1lYW4odW5lbXBkaWZmZXJlbmNlc1dBKSwgbWVhbih1bmVtcGRpZmZlcmVuY2VzUEEpLCBtZWFuKHVuZW1wZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIkRpZmZlcmVuY2UgaW4gVW5lbXBsb3ltZW50IFJhdGUiLCA0KQ0KbG93ZXJjb25mIDwtIGModW5lbXBjb25mQ0FbMV0sIHVuZW1wY29uZldBWzFdLCB1bmVtcGNvbmZQQVsxXSwgdW5lbXBjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyh1bmVtcGNvbmZDQVsyXSwgdW5lbXBjb25mV0FbMl0sIHVuZW1wY29uZlBBWzJdLCB1bmVtcGNvbmZUWFsyXSkNCnVuZW1wZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCnlvdW5nY29uZkNBIDwtIHQudGVzdCh5b3VuZ2RpZmZlcmVuY2VzQ0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KeW91bmdjb25mV0EgPC0gdC50ZXN0KHlvdW5nZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp5b3VuZ2NvbmZQQSA8LSB0LnRlc3QoeW91bmdkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCnlvdW5nY29uZlRYIDwtIHQudGVzdCh5b3VuZ2RpZmZlcmVuY2VzVFgsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KbWVhbnMgPC0gYyhtZWFuKHlvdW5nZGlmZmVyZW5jZXNDQSksIG1lYW4oeW91bmdkaWZmZXJlbmNlc1dBKSwgbWVhbih5b3VuZ2RpZmZlcmVuY2VzUEEpLCBtZWFuKHlvdW5nZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIkRpZmZlcmVuY2UgaW4gUGVyY2VudGFnZSBBZ2VkIDIwLTM0IiwgNCkNCmxvd2VyY29uZiA8LSBjKHlvdW5nY29uZkNBWzFdLCB5b3VuZ2NvbmZXQVsxXSwgeW91bmdjb25mUEFbMV0sIHlvdW5nY29uZlRYWzFdKQ0KdXBwZXJjb25mIDwtIGMoeW91bmdjb25mQ0FbMl0sIHlvdW5nY29uZldBWzJdLCB5b3VuZ2NvbmZQQVsyXSwgeW91bmdjb25mVFhbMl0pDQp5b3VuZ2RmIDwtIGRhdGEuZnJhbWUoc3RhdGVzLCBtZWFucywgbG93ZXJjb25mLCB1cHBlcmNvbmYsIGxhYmVsKQ0KDQpzb21lY29sbGVnZWNvbmZDQSA8LSB0LnRlc3Qoc29tZWNvbGxlZ2VkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCnNvbWVjb2xsZWdlY29uZldBIDwtIHQudGVzdChzb21lY29sbGVnZWRpZmZlcmVuY2VzV0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0Kc29tZWNvbGxlZ2Vjb25mUEEgPC0gdC50ZXN0KHNvbWVjb2xsZWdlZGlmZmVyZW5jZXNQQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQpzb21lY29sbGVnZWNvbmZUWCA8LSB0LnRlc3Qoc29tZWNvbGxlZ2VkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihzb21lY29sbGVnZWRpZmZlcmVuY2VzQ0EpLCBtZWFuKHNvbWVjb2xsZWdlZGlmZmVyZW5jZXNXQSksIG1lYW4oc29tZWNvbGxlZ2VkaWZmZXJlbmNlc1BBKSwgbWVhbihzb21lY29sbGVnZWRpZmZlcmVuY2VzVFgpKQ0Kc3RhdGVzIDwtIGMoIkNhbGlmb3JuaWEiLCAiV2FzaGluZ3RvbiIsICJQZW5uc3lsdmFuaWEiLCAiVGV4YXMiKQ0KbGFiZWwgPC0gcmVwKCJEaWZmZXJlbmNlIGluIFBlcmNlbnRhZ2Ugd2l0aCBTb21lIENvbGxlZ2UgYnV0IE5vIERlZ3JlZSIsIDQpDQpsb3dlcmNvbmYgPC0gYyhzb21lY29sbGVnZWNvbmZDQVsxXSwgc29tZWNvbGxlZ2Vjb25mV0FbMV0sIHNvbWVjb2xsZWdlY29uZlBBWzFdLCBzb21lY29sbGVnZWNvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKHNvbWVjb2xsZWdlY29uZkNBWzJdLCBzb21lY29sbGVnZWNvbmZXQVsyXSwgc29tZWNvbGxlZ2Vjb25mUEFbMl0sIHNvbWVjb2xsZWdlY29uZlRYWzJdKQ0Kc29tZWNvbGxlZ2VkZiA8LSBkYXRhLmZyYW1lKHN0YXRlcywgbWVhbnMsIGxvd2VyY29uZiwgdXBwZXJjb25mLCBsYWJlbCkNCg0Kd2hpdGVjb25mQ0EgPC0gdC50ZXN0KHdoaXRlZGlmZmVyZW5jZXNDQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp3aGl0ZWNvbmZXQSA8LSB0LnRlc3Qod2hpdGVkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCndoaXRlY29uZlBBIDwtIHQudGVzdCh3aGl0ZWRpZmZlcmVuY2VzUEEsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0Kd2hpdGVjb25mVFggPC0gdC50ZXN0KHdoaXRlZGlmZmVyZW5jZXNUWCwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQptZWFucyA8LSBjKG1lYW4od2hpdGVkaWZmZXJlbmNlc0NBKSwgbWVhbih3aGl0ZWRpZmZlcmVuY2VzV0EpLCBtZWFuKHdoaXRlZGlmZmVyZW5jZXNQQSksIG1lYW4od2hpdGVkaWZmZXJlbmNlc1RYKSkNCnN0YXRlcyA8LSBjKCJDYWxpZm9ybmlhIiwgIldhc2hpbmd0b24iLCAiUGVubnN5bHZhbmlhIiwgIlRleGFzIikNCmxhYmVsIDwtIHJlcCgiRGlmZmVyZW5jZSBpbiBQZXJjZW50YWdlIFdoaXRlIiwgNCkNCmxvd2VyY29uZiA8LSBjKHdoaXRlY29uZkNBWzFdLCB3aGl0ZWNvbmZXQVsxXSwgd2hpdGVjb25mUEFbMV0sIHdoaXRlY29uZlRYWzFdKQ0KdXBwZXJjb25mIDwtIGMod2hpdGVjb25mQ0FbMl0sIHdoaXRlY29uZldBWzJdLCB3aGl0ZWNvbmZQQVsyXSwgd2hpdGVjb25mVFhbMl0pDQp3aGl0ZWRmIDwtIGRhdGEuZnJhbWUoc3RhdGVzLCBtZWFucywgbG93ZXJjb25mLCB1cHBlcmNvbmYsIGxhYmVsKQ0KDQp0d29yYWNlY29uZkNBIDwtIHQudGVzdCh0d29yYWNlZGlmZmVyZW5jZXNDQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp0d29yYWNlY29uZldBIDwtIHQudGVzdCh0d29yYWNlZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp0d29yYWNlY29uZlBBIDwtIHQudGVzdCh0d29yYWNlZGlmZmVyZW5jZXNQQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp0d29yYWNlY29uZlRYIDwtIHQudGVzdCh0d29yYWNlZGlmZmVyZW5jZXNUWCwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQptZWFucyA8LSBjKG1lYW4odHdvcmFjZWRpZmZlcmVuY2VzQ0EpLCBtZWFuKHR3b3JhY2VkaWZmZXJlbmNlc1dBKSwgbWVhbih0d29yYWNlZGlmZmVyZW5jZXNQQSksIG1lYW4odHdvcmFjZWRpZmZlcmVuY2VzVFgpKQ0Kc3RhdGVzIDwtIGMoIkNhbGlmb3JuaWEiLCAiV2FzaGluZ3RvbiIsICJQZW5uc3lsdmFuaWEiLCAiVGV4YXMiKQ0KbGFiZWwgPC0gcmVwKCJEaWZmZXJlbmNlIGluIFBlcmNlbnRhZ2UgQmlyYWNpYWwiLCA0KQ0KbG93ZXJjb25mIDwtIGModHdvcmFjZWNvbmZDQVsxXSwgdHdvcmFjZWNvbmZXQVsxXSwgdHdvcmFjZWNvbmZQQVsxXSwgdHdvcmFjZWNvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKHR3b3JhY2Vjb25mQ0FbMl0sIHR3b3JhY2Vjb25mV0FbMl0sIHR3b3JhY2Vjb25mUEFbMl0sIHR3b3JhY2Vjb25mVFhbMl0pDQp0d29yYWNlZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCmVsZGVybHljb25mQ0EgPC0gdC50ZXN0KGVsZGVybHlkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVsZGVybHljb25mV0EgPC0gdC50ZXN0KGVsZGVybHlkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVsZGVybHljb25mUEEgPC0gdC50ZXN0KGVsZGVybHlkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVsZGVybHljb25mVFggPC0gdC50ZXN0KGVsZGVybHlkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihlbGRlcmx5ZGlmZmVyZW5jZXNDQSksIG1lYW4oZWxkZXJseWRpZmZlcmVuY2VzV0EpLCBtZWFuKGVsZGVybHlkaWZmZXJlbmNlc1BBKSwgbWVhbihlbGRlcmx5ZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIkRpZmZlcmVuY2UgaW4gUGVyY2VudGFnZSBvZiBFbGRlcmx5IFVuZGVyIHRoZSBQb3ZlcnR5IExpbmUiLCA0KQ0KbG93ZXJjb25mIDwtIGMoZWxkZXJseWNvbmZDQVsxXSwgZWxkZXJseWNvbmZXQVsxXSwgZWxkZXJseWNvbmZQQVsxXSwgZWxkZXJseWNvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKGVsZGVybHljb25mQ0FbMl0sIGVsZGVybHljb25mV0FbMl0sIGVsZGVybHljb25mUEFbMl0sIGVsZGVybHljb25mVFhbMl0pDQplbGRlcmx5ZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCnRyYWRlY29uZkNBIDwtIHQudGVzdCh0cmFkZWRpZmZlcmVuY2VzQ0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KdHJhZGVjb25mV0EgPC0gdC50ZXN0KHRyYWRlZGlmZmVyZW5jZXNXQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQp0cmFkZWNvbmZQQSA8LSB0LnRlc3QodHJhZGVkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCnRyYWRlY29uZlRYIDwtIHQudGVzdCh0cmFkZWRpZmZlcmVuY2VzVFgsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KbWVhbnMgPC0gYyhtZWFuKHRyYWRlZGlmZmVyZW5jZXNDQSksIG1lYW4odHJhZGVkaWZmZXJlbmNlc1dBKSwgbWVhbih0cmFkZWRpZmZlcmVuY2VzUEEpLCBtZWFuKHRyYWRlZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIkRpZmZlcmVuY2UgaW4gUGVyY2VudGFnZSBFbXBsb3llZCBpbiBXaG9sZXNhbGUgVHJhZGUiLCA0KQ0KbG93ZXJjb25mIDwtIGModHJhZGVjb25mQ0FbMV0sIHRyYWRlY29uZldBWzFdLCB0cmFkZWNvbmZQQVsxXSwgdHJhZGVjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyh0cmFkZWNvbmZDQVsyXSwgdHJhZGVjb25mV0FbMl0sIHRyYWRlY29uZlBBWzJdLCB0cmFkZWNvbmZUWFsyXSkNCnRyYWRlZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCmVuZ2xpc2hjb25mQ0EgPC0gdC50ZXN0KGVuZ2xpc2hkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVuZ2xpc2hjb25mV0EgPC0gdC50ZXN0KGVuZ2xpc2hkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVuZ2xpc2hjb25mUEEgPC0gdC50ZXN0KGVuZ2xpc2hkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVuZ2xpc2hjb25mVFggPC0gdC50ZXN0KGVuZ2xpc2hkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihlbmdsaXNoZGlmZmVyZW5jZXNDQSksIG1lYW4oZW5nbGlzaGRpZmZlcmVuY2VzV0EpLCBtZWFuKGVuZ2xpc2hkaWZmZXJlbmNlc1BBKSwgbWVhbihlbmdsaXNoZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIlBlcmNlbnRhZ2UgU3BlYWtpbmcgRW5nbGlzaCBhdCBIb21lIERpZmZlcmVuY2UiLCA0KQ0KbG93ZXJjb25mIDwtIGMoZW5nbGlzaGNvbmZDQVsxXSwgZW5nbGlzaGNvbmZXQVsxXSwgZW5nbGlzaGNvbmZQQVsxXSwgZW5nbGlzaGNvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKGVuZ2xpc2hjb25mQ0FbMl0sIGVuZ2xpc2hjb25mV0FbMl0sIGVuZ2xpc2hjb25mUEFbMl0sIGVuZ2xpc2hjb25mVFhbMl0pDQplbmdsaXNoZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQoNCm1hcnJpZWRjb25mQ0EgPC0gdC50ZXN0KG1hcnJpZWRkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1hcnJpZWRjb25mV0EgPC0gdC50ZXN0KG1hcnJpZWRkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1hcnJpZWRjb25mUEEgPC0gdC50ZXN0KG1hcnJpZWRkaWZmZXJlbmNlc1BBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1hcnJpZWRjb25mVFggPC0gdC50ZXN0KG1hcnJpZWRkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihtYXJyaWVkZGlmZmVyZW5jZXNDQSksIG1lYW4obWFycmllZGRpZmZlcmVuY2VzV0EpLCBtZWFuKG1hcnJpZWRkaWZmZXJlbmNlc1BBKSwgbWVhbihtYXJyaWVkZGlmZmVyZW5jZXNUWCkpDQpzdGF0ZXMgPC0gYygiQ2FsaWZvcm5pYSIsICJXYXNoaW5ndG9uIiwgIlBlbm5zeWx2YW5pYSIsICJUZXhhcyIpDQpsYWJlbCA8LSByZXAoIlBlcmNlbnRhZ2Ugb2YgTWFycmllZCBXb21lbiBEaWZmZXJlbmNlIiwgNCkNCmxvd2VyY29uZiA8LSBjKG1hcnJpZWRjb25mQ0FbMV0sIG1hcnJpZWRjb25mV0FbMV0sIG1hcnJpZWRjb25mUEFbMV0sIG1hcnJpZWRjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyhtYXJyaWVkY29uZkNBWzJdLCBtYXJyaWVkY29uZldBWzJdLCBtYXJyaWVkY29uZlBBWzJdLCBtYXJyaWVkY29uZlRYWzJdKQ0KbWFycmllZGRmIDwtIGRhdGEuZnJhbWUoc3RhdGVzLCBtZWFucywgbG93ZXJjb25mLCB1cHBlcmNvbmYsIGxhYmVsKQ0KDQpoaXNwYW5pY2NvbmZDQSA8LSB0LnRlc3QoaGlzcGFuaWNkaWZmZXJlbmNlc0NBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmhpc3BhbmljY29uZldBIDwtIHQudGVzdChoaXNwYW5pY2RpZmZlcmVuY2VzV0EsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KaGlzcGFuaWNjb25mUEEgPC0gdC50ZXN0KGhpc3BhbmljZGlmZmVyZW5jZXNQQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQpoaXNwYW5pY2NvbmZUWCA8LSB0LnRlc3QoaGlzcGFuaWNkaWZmZXJlbmNlc1RYLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCm1lYW5zIDwtIGMobWVhbihoaXNwYW5pY2RpZmZlcmVuY2VzQ0EpLCBtZWFuKGhpc3BhbmljZGlmZmVyZW5jZXNXQSksIG1lYW4oaGlzcGFuaWNkaWZmZXJlbmNlc1BBKSwgbWVhbihoaXNwYW5pY2RpZmZlcmVuY2VzVFgpKQ0Kc3RhdGVzIDwtIGMoIkNhbGlmb3JuaWEiLCAiV2FzaGluZ3RvbiIsICJQZW5uc3lsdmFuaWEiLCAiVGV4YXMiKQ0KbGFiZWwgPC0gcmVwKCJEaWZmZXJlbmNlIGluIFBlcmNlbnRhZ2UgUG9wdWxhdGlvbiBIaXNwYW5pYyIsIDQpDQpsb3dlcmNvbmYgPC0gYyhoaXNwYW5pY2NvbmZDQVsxXSwgaGlzcGFuaWNjb25mV0FbMV0sIGhpc3BhbmljY29uZlBBWzFdLCBoaXNwYW5pY2NvbmZUWFsxXSkNCnVwcGVyY29uZiA8LSBjKGhpc3BhbmljY29uZkNBWzJdLCBoaXNwYW5pY2NvbmZXQVsyXSwgaGlzcGFuaWNjb25mUEFbMl0sIGhpc3BhbmljY29uZlRYWzJdKQ0KaGlzcGFuaWNkZiA8LSBkYXRhLmZyYW1lKHN0YXRlcywgbWVhbnMsIGxvd2VyY29uZiwgdXBwZXJjb25mLCBsYWJlbCkNCg0KZW5yb2xsZWRjb25mQ0EgPC0gdC50ZXN0KGVucm9sbGVkZGlmZmVyZW5jZXNDQSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQplbnJvbGxlZGNvbmZXQSA8LSB0LnRlc3QoZW5yb2xsZWRkaWZmZXJlbmNlc1dBLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQNCmVucm9sbGVkY29uZlBBIDwtIHQudGVzdChlbnJvbGxlZGRpZmZlcmVuY2VzUEEsIGNvbmYubGV2ZWwgPSAwLjk1KSRjb25mLmludA0KZW5yb2xsZWRjb25mVFggPC0gdC50ZXN0KGVucm9sbGVkZGlmZmVyZW5jZXNUWCwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50DQptZWFucyA8LSBjKG1lYW4oZW5yb2xsZWRkaWZmZXJlbmNlc0NBKSwgbWVhbihlbnJvbGxlZGRpZmZlcmVuY2VzV0EpLCBtZWFuKGVucm9sbGVkZGlmZmVyZW5jZXNQQSksIG1lYW4oZW5yb2xsZWRkaWZmZXJlbmNlc1RYKSkNCnN0YXRlcyA8LSBjKCJDYWxpZm9ybmlhIiwgIldhc2hpbmd0b24iLCAiUGVubnN5bHZhbmlhIiwgIlRleGFzIikNCmxhYmVsIDwtIHJlcCgiUGVyY2VudCBFbnJvbGxlZCBpbiBDb2xsZWdlIERpZmZlcmVuY2UiLCA0KQ0KbG93ZXJjb25mIDwtIGMoZW5yb2xsZWRjb25mQ0FbMV0sIGVucm9sbGVkY29uZldBWzFdLCBlbnJvbGxlZGNvbmZQQVsxXSwgZW5yb2xsZWRjb25mVFhbMV0pDQp1cHBlcmNvbmYgPC0gYyhlbnJvbGxlZGNvbmZDQVsyXSwgZW5yb2xsZWRjb25mV0FbMl0sIGVucm9sbGVkY29uZlBBWzJdLCBlbnJvbGxlZGNvbmZUWFsyXSkNCmVucm9sbGVkZGYgPC0gZGF0YS5mcmFtZShzdGF0ZXMsIG1lYW5zLCBsb3dlcmNvbmYsIHVwcGVyY29uZiwgbGFiZWwpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QodmV0ZGYsIGFlcyh4ID0gbGFiZWwsIHkgPSBtZWFucywgY29sb3IgPSBzdGF0ZXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMTgsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IHVwcGVyY29uZiwgeW1pbiA9IGxvd2VyY29uZiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpDQpgYGANCmBgYHtyfQ0KdmV0YWcgPC0gcmJpbmQoYWdkZiwgdmV0ZGYpDQpnZ3Bsb3QodmV0YWcsIGFlcyh4ID0gbGFiZWwsIHkgPSBtZWFucywgY29sb3IgPSBzdGF0ZXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMTgsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IHVwcGVyY29uZiwgeW1pbiA9IGxvd2VyY29uZiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYWdkZiwgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChibGFja2RmLCBhZXMoeCA9IGxhYmVsLCB5ID0gbWVhbnMsIGNvbG9yID0gc3RhdGVzKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSA0LCBzaGFwZSA9IDE4LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSB1cHBlcmNvbmYsIHltaW4gPSBsb3dlcmNvbmYpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKQ0KDQpnZ3Bsb3QoaW5jb21lZGYsIGFlcyh4ID0gbGFiZWwsIHkgPSBtZWFucywgY29sb3IgPSBzdGF0ZXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMTgsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IHVwcGVyY29uZiwgeW1pbiA9IGxvd2VyY29uZiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpDQpgYGANCg0KYGBge3J9DQpwbG90MSA8LSBkby5jYWxsKCJyYmluZCIsIGxpc3QoYmxhY2tkZiwgYWdkZiwgdmV0ZGYpKQ0KcGxvdDIgPC0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KHVuZW1wZGYsIHlvdW5nZGYsIHNvbWVjb2xsZWdlZGYsIHdoaXRlZGYpKQ0KcGxvdDMgPC0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KHR3b3JhY2VkZiwgZWxkZXJseWRmLCB0cmFkZWRmLCBlbmdsaXNoZGYpKQ0KcGxvdDQgPC0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KG1hcnJpZWRkZiwgaGlzcGFuaWNkZiwgZW5yb2xsZWRkZikpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QocGxvdDEsIGFlcyh4ID0gbGFiZWwsIHkgPSBtZWFucywgY29sb3IgPSBzdGF0ZXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMTgsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IHVwcGVyY29uZiwgeW1pbiA9IGxvd2VyY29uZiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChwbG90MiwgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHBsb3QzLCBhZXMoeCA9IGxhYmVsLCB5ID0gbWVhbnMsIGNvbG9yID0gc3RhdGVzKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSA0LCBzaGFwZSA9IDE4LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSB1cHBlcmNvbmYsIHltaW4gPSBsb3dlcmNvbmYpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QocGxvdDQsIGFlcyh4ID0gbGFiZWwsIHkgPSBtZWFucywgY29sb3IgPSBzdGF0ZXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMTgsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IHVwcGVyY29uZiwgeW1pbiA9IGxvd2VyY29uZiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkNCmBgYA0KDQpgYGB7cn0NCmVuZ2xpc2hBbGxEaXN0cmljdHMgPC0gYyhlbmdsaXNoZGlmZmVyZW5jZXNDQSwgZW5nbGlzaGRpZmZlcmVuY2VzUEEsIGVuZ2xpc2hkaWZmZXJlbmNlc1RYLCBlbmdsaXNoZGlmZmVyZW5jZXNXQSkNCmFsbFN0YXRlcyA8LSBjKHJlcCgiQ2FsaWZvcm5pYSIsNTMpLCByZXAoIlBlbm5zeWx2YW5pYSIsMTgpLCByZXAoIlRleGFzIiwzNiksIHJlcCgiV2FzaGluZ3RvbiIsIDEwKSkNCmRpc3RyaWN0IDwtIGMoY2FsaTIwMTIkRGlzdHJpY3ROdW0sIHBlbm4yMDEyJERpc3RyaWN0TnVtLCB0eDIwMTIkRGlzdHJpY3ROdW0sIHdhc2gyMDEyJERpc3RyaWN0TnVtKQ0KYWxsQ29tbWlzc2lvbiA8LSBjKHJlcCgiSW5kZXBlbmRlbnQiLCA2MyksIHJlcCgiUGFydGlzYW4iLCA1NCkpDQplbmdsaXNoQm94REYgPC0gZGF0YS5mcmFtZShlbmdsaXNoQWxsRGlzdHJpY3RzLCBhbGxTdGF0ZXMsIGRpc3RyaWN0KQ0KDQpjaGVja19vdXRsaWVyIDwtIGZ1bmN0aW9uKHYsIGNvZWY9MS41MSl7DQogIHF1YW50aWxlcyA8LSBxdWFudGlsZSh2LHByb2JzPWMoMC4yNSwwLjc1KSkNCiAgSVFSIDwtIHF1YW50aWxlc1syXS1xdWFudGlsZXNbMV0NCiAgcmVzIDwtIHYgPCAocXVhbnRpbGVzWzFdLWNvZWYqSVFSKXx2ID4gKHF1YW50aWxlc1syXStjb2VmKklRUikNCiAgcmV0dXJuKHJlcykNCn0NCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQoNCmNvbW1pc3Npb25FbmdsaXNoIDwtIGVuZ2xpc2hCb3hERiAlPiUNCiAgbXV0YXRlKGNvbW1pc3Npb24gPSBpZmVsc2UoYWxsU3RhdGVzID09ICJDYWxpZm9ybmlhIiwgIkluZGVwZW5kZW50IiwgaWZlbHNlKGFsbFN0YXRlcyA9PSAiV2FzaGluZ3RvbiIsICJJbmRlcGVuZGVudCIsICJQYXJ0aXNhbiIpKSkNCg0KaW5kZXBlbmRlbnRFbmdsaXNoIDwtIGNvbW1pc3Npb25FbmdsaXNoICU+JQ0KICBmaWx0ZXIoY29tbWlzc2lvbiA9PSAiSW5kZXBlbmRlbnQiKSAlPiUNCiAgbXV0YXRlKG91dGxpZXJzID0gaWZlbHNlKGNoZWNrX291dGxpZXIoZW5nbGlzaEFsbERpc3RyaWN0cyksIHBhc3RlKGFsbFN0YXRlcywgYXMuY2hhcmFjdGVyKGRpc3RyaWN0KSwgc2VwID0gIiAiKSwgIiIpKQ0KDQpwYXJ0aXNhbkVuZ2xpc2ggPC0gY29tbWlzc2lvbkVuZ2xpc2ggJT4lDQogIGZpbHRlcihjb21taXNzaW9uID09ICJQYXJ0aXNhbiIpICU+JQ0KICBtdXRhdGUob3V0bGllcnMgPSBpZmVsc2UoY2hlY2tfb3V0bGllcihlbmdsaXNoQWxsRGlzdHJpY3RzKSwgcGFzdGUoYWxsU3RhdGVzLCBhcy5jaGFyYWN0ZXIoZGlzdHJpY3QpLCBzZXAgPSAiICIpLCAiIikpDQoNCm91dGxpZXJFbmdsaXNoIDwtIHJiaW5kKGluZGVwZW5kZW50RW5nbGlzaCwgcGFydGlzYW5FbmdsaXNoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3JlcGVsKQ0KZ2dwbG90KGRhdGEgPSBvdXRsaWVyRW5nbGlzaCwgYWVzKHggPSBjb21taXNzaW9uLCB5ID0gZW5nbGlzaEFsbERpc3RyaWN0cywgY29sb3IgPSBjb21taXNzaW9uKSkgKyANCiAgICAgZ2VvbV9ib3hwbG90KCkgKyBnZ3RpdGxlKCJBYnNvbHV0ZSBEaWZmZXJlbmNlIG9mIFBlcmNlbnRhZ2UgU3BlYWtpbmcgRW5nbGlzaCBhdCBIb21lIikgKw0KICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPW91dGxpZXJzKSkNCmBgYA0KYGBge3J9DQpwbG90NSA8LSBkby5jYWxsKCJyYmluZCIsIGxpc3Qod2hpdGVkZixibGFja2RmLCBoaXNwYW5pY2RmLCB0d29yYWNlZGYpKQ0KcGxvdDYgPC0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KHVuZW1wZGYsIGVsZGVybHlkZiwgdHJhZGVkZiwgYWdkZikpDQpwbG90NyA8LSBkby5jYWxsKCJyYmluZCIsIGxpc3QoZW5yb2xsZWRkZiwgc29tZWNvbGxlZ2VkZiwgdmV0ZGYpKQ0KcGxvdDggPC0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KHlvdW5nZGYsIG1hcnJpZWRkZiwgZW5nbGlzaGRmKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChwbG90NSwgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIGdndGl0bGUoIlJhY2UgRGlmZmVyZW5jZXMgYnkgU3RhdGUiKSArIHlsYWIoIkFic29sdXRlIERpZmZlcmVuY2UiKSArIA0KICB4bGFiKCIiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChwbG90NiwgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIGdndGl0bGUoIkVjb25vbWljIENvbmdyZXNzaW9uYWwgRGlzdHJpY3QgTmVpZ2hib3IgRGlmZmVyZW5jZXMgYnkgU3RhdGUiKSArIHlsYWIoIkFic29sdXRlIERpZmZlcmVuY2UiKSArIA0KICB4bGFiKCIiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChwbG90NywgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIGdndGl0bGUoIkVkdWNhdGlvbmFsIENvbmdyZXNzaW9uYWwgRGlzdHJpY3QgTmVpZ2hib3IgRGlmZmVyZW5jZXMgYnkgU3RhdGUiKSArIHlsYWIoIkFic29sdXRlIERpZmZlcmVuY2UiKSArIA0KICB4bGFiKCIiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChwbG90OCwgYWVzKHggPSBsYWJlbCwgeSA9IG1lYW5zLCBjb2xvciA9IHN0YXRlcykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgc2hhcGUgPSAxOCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gdXBwZXJjb25mLCB5bWluID0gbG93ZXJjb25mKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIGdndGl0bGUoIlNvY2lhbCBTdGF0aXN0aWMgQ29uZ3Jlc3Npb25hbCBEaXN0cmljdCBOZWlnaGJvciBEaWZmZXJlbmNlcyBieSBTdGF0ZSIpICsgeWxhYigiQWJzb2x1dGUgRGlmZmVyZW5jZSIpICsgDQogIHhsYWIoIiIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCmBgYHtyfQ0Kd2hpdGVBbGxEaXN0cmljdHMgPC0gYyh3aGl0ZWRpZmZlcmVuY2VzQ0EsIHdoaXRlZGlmZmVyZW5jZXNXQSwgd2hpdGVkaWZmZXJlbmNlc1RYLCB3aGl0ZWRpZmZlcmVuY2VzUEEpDQpibGFja0FsbERpc3RyaWN0cyA8LSBjKGJsYWNrZGlmZmVyZW5jZXNDQSwgYmxhY2tkaWZmZXJlbmNlc1dBLCBibGFja2RpZmZlcmVuY2VzVFgsIGJsYWNrZGlmZmVyZW5jZXNQQSkNCmhpc3BhbmljQWxsRGlzdHJpY3RzIDwtIGMoaGlzcGFuaWNkaWZmZXJlbmNlc0NBLCBoaXNwYW5pY2RpZmZlcmVuY2VzV0EsIGhpc3BhbmljZGlmZmVyZW5jZXNUWCwgaGlzcGFuaWNkaWZmZXJlbmNlc1BBKQ0KdHdvcmFjZUFsbERpc3RyaWN0cyA8LSBjKHR3b3JhY2VkaWZmZXJlbmNlc0NBLCB0d29yYWNlZGlmZmVyZW5jZXNXQSwgdHdvcmFjZWRpZmZlcmVuY2VzVFgsIHR3b3JhY2VkaWZmZXJlbmNlc1BBKQ0KbGFiZWxzIDwtIGMocmVwKCJQZXJjZW50YWdlIFdoaXRlIERpZmZlcmVuY2UiLCAxMTcpLCByZXAoIlBlcmNlbnRhZ2UgQmxhY2sgRGlmZmVyZW5jZSIsIDExNyksIHJlcCgiUGVyY2VudGFnZSBIaXNwYW5pYyBEaWZmZXJlbmNlIiwgMTE3KSwNCiAgICAgICAgICAgIHJlcCgiUGVyY2VudGFnZSBCaXJhY2lhbCBEaWZmZXJlbmNlIiwxMTcpKQ0KcmFjZURhdGEgPC0gYyh3aGl0ZUFsbERpc3RyaWN0cywgYmxhY2tBbGxEaXN0cmljdHMsIGhpc3BhbmljQWxsRGlzdHJpY3RzLCB0d29yYWNlQWxsRGlzdHJpY3RzKQ0KYWxsU3RhdGVzIDwtIHJlcChjKHJlcCgiQ2FsaWZvcm5pYSIsNTMpLCByZXAoIldhc2hpbmd0b24iLDEwKSwgcmVwKCJUZXhhcyIsMzYpLCByZXAoIlBlbm5zeWx2YW5pYSIsIDE4KSksNCkNCmFsbENvbW1pc3Npb24gPC0gcmVwKGMocmVwKCJJbmRlcGVuZGVudCIsIDYzKSwgcmVwKCJQYXJ0aXNhbiIsIDU0KSksNCkNCmRpc3RyaWN0IDwtIHJlcChjKGNhbGkyMDEyJERpc3RyaWN0TnVtLCB3YXNoMjAxMiREaXN0cmljdE51bSwgdHgyMDEyJERpc3RyaWN0TnVtLCBwZW5uMjAxMiREaXN0cmljdE51bSksNCkNCnJhY2VCb3hERiA8LSBkYXRhLmZyYW1lKHJhY2VEYXRhLCBhbGxTdGF0ZXMsIGFsbENvbW1pc3Npb24sIGRpc3RyaWN0LCBsYWJlbHMpDQpgYGANCg0KYGBge3J9DQp1bmVtcEFsbERpc3RyaWN0cyA8LSBjKHVuZW1wZGlmZmVyZW5jZXNDQSwgdW5lbXBkaWZmZXJlbmNlc1dBLCB1bmVtcGRpZmZlcmVuY2VzVFgsIHVuZW1wZGlmZmVyZW5jZXNQQSkNCmVsZGVybHlBbGxEaXN0cmljdHMgPC0gYyhlbGRlcmx5ZGlmZmVyZW5jZXNDQSwgZWxkZXJseWRpZmZlcmVuY2VzV0EsIGVsZGVybHlkaWZmZXJlbmNlc1RYLCBlbGRlcmx5ZGlmZmVyZW5jZXNQQSkNCnRyYWRlQWxsRGlzdHJpY3RzIDwtIGModHJhZGVkaWZmZXJlbmNlc0NBLCB0cmFkZWRpZmZlcmVuY2VzV0EsIHRyYWRlZGlmZmVyZW5jZXNUWCwgdHJhZGVkaWZmZXJlbmNlc1BBKQ0KYWdBbGxEaXN0cmljdHMgPC0gYyhhZ2RpZmZlcmVuY2VzQ0EsIGFnZGlmZmVyZW5jZXNXQSwgYWdkaWZmZXJlbmNlc1RYLCBhZ2RpZmZlcmVuY2VzUEEpDQplbnJvbGxlZEFsbERpc3RyaWN0cyA8LSBjKGVucm9sbGVkZGlmZmVyZW5jZXNDQSwgZW5yb2xsZWRkaWZmZXJlbmNlc1dBLCBlbnJvbGxlZGRpZmZlcmVuY2VzVFgsIGVucm9sbGVkZGlmZmVyZW5jZXNQQSkNCnNvbWVjb2xsZWdlQWxsRGlzdHJpY3RzIDwtIGMoc29tZWNvbGxlZ2VkaWZmZXJlbmNlc0NBLCBzb21lY29sbGVnZWRpZmZlcmVuY2VzV0EsIHNvbWVjb2xsZWdlZGlmZmVyZW5jZXNUWCwgc29tZWNvbGxlZ2VkaWZmZXJlbmNlc1BBKQ0KdmV0QWxsRGlzdHJpY3RzIDwtIGModmV0ZGlmZmVyZW5jZXNDQSwgdmV0ZGlmZmVyZW5jZXNXQSwgdmV0ZGlmZmVyZW5jZXNUWCwgdmV0ZGlmZmVyZW5jZXNQQSkNCnlvdW5nQWxsRGlzdHJpY3RzIDwtIGMoeW91bmdkaWZmZXJlbmNlc0NBLCB5b3VuZ2RpZmZlcmVuY2VzV0EsIHlvdW5nZGlmZmVyZW5jZXNUWCwgeW91bmdkaWZmZXJlbmNlc1BBKQ0KbWFycmllZEFsbERpc3RyaWN0cyA8LSBjKG1hcnJpZWRkaWZmZXJlbmNlc0NBLCBtYXJyaWVkZGlmZmVyZW5jZXNXQSwgbWFycmllZGRpZmZlcmVuY2VzVFgsIG1hcnJpZWRkaWZmZXJlbmNlc1BBKQ0KZm9yZWlnbkFsbERpc3RyaWN0cyA8LSBjKGZvcmVpZ25kaWZmZXJlbmNlc0NBLCBmb3JlaWduZGlmZmVyZW5jZXNXQSwgZm9yZWlnbmRpZmZlcmVuY2VzVFgsIGZvcmVpZ25kaWZmZXJlbmNlc1BBKQ0KaW5jb21lQWxsRGlzdHJpY3RzIDwtIGMoaW5jb21lZGlmZmVyZW5jZXNDQSwgaW5jb21lZGlmZmVyZW5jZXNXQSwgaW5jb21lZGlmZmVyZW5jZXNUWCwgaW5jb21lZGlmZmVyZW5jZXNQQSkNCg0KYWxsRGF0YSA8LSBjKHJhY2VEYXRhLCB1bmVtcEFsbERpc3RyaWN0cywgZWxkZXJseUFsbERpc3RyaWN0cywgdHJhZGVBbGxEaXN0cmljdHMsIGFnQWxsRGlzdHJpY3RzLCBlbnJvbGxlZEFsbERpc3RyaWN0cywgDQogICAgICAgICAgICAgc29tZWNvbGxlZ2VBbGxEaXN0cmljdHMsIHZldEFsbERpc3RyaWN0cywgeW91bmdBbGxEaXN0cmljdHMsIG1hcnJpZWRBbGxEaXN0cmljdHMsIGVuZ2xpc2hBbGxEaXN0cmljdHMsIA0KICAgICAgICAgICAgIGZvcmVpZ25BbGxEaXN0cmljdHMsIGluY29tZUFsbERpc3RyaWN0cykNCmBgYA0KDQpgYGB7cn0NCmxhYmVscyA8LSBjKHJlcCgiUGVyY2VudGFnZSBXaGl0ZSBEaWZmZXJlbmNlIiwgMTE3KSwgDQogICAgICAgICAgICByZXAoIlBlcmNlbnRhZ2UgQmxhY2sgRGlmZmVyZW5jZSIsIDExNyksIA0KICAgICAgICAgICAgcmVwKCJQZXJjZW50YWdlIEhpc3BhbmljIERpZmZlcmVuY2UiLCAxMTcpLA0KICAgICAgICAgICAgcmVwKCJQZXJjZW50YWdlIEJpcmFjaWFsIERpZmZlcmVuY2UiLDExNyksIA0KICAgICAgICAgICAgcmVwKCJVbmVtcGxveW1lbnQgUmF0ZSBEaWZmZXJlbmNlIiwxMTcpLCANCiAgICAgICAgICAgIHJlcCgiUGVyY2VudCBQb29yIEVsZGVybHkgRGlmZmVyZW5jZSIsIDExNyksDQogICAgICAgICAgICByZXAoIlBlcmNlbnQgRW1wbG95ZWQgaW4gV2hvbGVzYWxlIFRyYWRlIERpZmZlcmVuY2UiLCAxMTcpLCANCiAgICAgICAgICAgIHJlcCgiUGVyY2VudCBFbXBsb3llZCBpbiBBZ3JpY3VsdHVyZSBEaWZmZXJlbmNlIiwgMTE3KSwgDQogICAgICAgICAgICByZXAoIlBlcmNlbnQgRW5yb2xsZWQgaW4gQ29sbGVnZSBEaWZmZXJlbmNlIiwgMTE3KSwgDQogICAgICAgICAgICByZXAoIlBlcmNlbnQgQ29sbGVnZSBEcm9wb3V0IERpZmZlcmVuY2UiLCAxMTcpLCANCiAgICAgICAgICAgIHJlcCgiVmV0ZXJhbiBQb3B1bGF0aW9uIERpZmZlcmVuY2UiLCAxMTcpLCANCiAgICAgICAgICAgIHJlcCgiUGVyY2VudCBBZ2UgMjAtMzQgRGlmZmVyZW5jZSIsMTE3KSwgDQogICAgICAgICAgICByZXAoIk1hcnJpZWQgRmVtYWxlIFBvcHVsYXRpb24gRGlmZmVyZW5jZSIsIDExNyksDQogICAgICAgICAgICByZXAoIlBlcmNlbnQgU3BlYWsgRW5nbGlzaCBhdCBIb21lIERpZmZlcmVuY2UiLDExNyksDQogICAgICAgICAgICByZXAoIkZvcmVpZ24gQm9ybiBEaWZmZXJlbmNlIiwxMTcpLA0KICAgICAgICAgICAgcmVwKCJQZXIgQ2FwaXRhIEluY29tZSBEaWZmZXJlbmNlIiwgMTE3KSkNCmFsbFN0YXRlcyA8LSByZXAoYyhyZXAoIkNhbGlmb3JuaWEiLDUzKSwgcmVwKCJXYXNoaW5ndG9uIiwxMCksIHJlcCgiVGV4YXMiLDM2KSwgcmVwKCJQZW5uc3lsdmFuaWEiLCAxOCkpLDE2KQ0KYWxsQ29tbWlzc2lvbiA8LSByZXAoYyhyZXAoIkluZGVwZW5kZW50IiwgNjMpLCByZXAoIlBhcnRpc2FuIiwgNTQpKSwxNikNCmRpc3RyaWN0IDwtIHJlcChjKGNhbGkyMDEyJERpc3RyaWN0TnVtLCB3YXNoMjAxMiREaXN0cmljdE51bSwgdHgyMDEyJERpc3RyaWN0TnVtLCBwZW5uMjAxMiREaXN0cmljdE51bSksMTYpDQphbGxCb3hERiA8LSBkYXRhLmZyYW1lKGFsbERhdGEsIGFsbFN0YXRlcywgYWxsQ29tbWlzc2lvbiwgZGlzdHJpY3QsIGxhYmVscykNCmBgYA0KDQoNCmBgYHtyfQ0KaXNfb3V0bGllciA8LSBmdW5jdGlvbih4KSB7DQogIHJldHVybih4IDwgcXVhbnRpbGUoeCwgMC4yNSkgLSAxLjUgKiBJUVIoeCkgfCB4ID4gcXVhbnRpbGUoeCwgMC43NSkgKyAxLjUgKiBJUVIoeCkpDQp9DQoNCnJhY2VCb3hERiAlPiUNCiAgZ3JvdXBfYnkobGFiZWxzLCBhbGxDb21taXNzaW9uKSAlPiUNCiAgbXV0YXRlKG91dGxpZXIgPSBpZmVsc2UoaXNfb3V0bGllcihyYWNlRGF0YSksIHBhc3RlKGFsbFN0YXRlcywgYXMuY2hhcmFjdGVyKGRpc3RyaWN0KSwgc2VwID0gIiAiKSwgIiIpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gbGFiZWxzLCB5ID0gcmFjZURhdGEsIGNvbG9yID0gYWxsQ29tbWlzc2lvbikpICsNCiAgICBnZW9tX2JveHBsb3QoKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBvdXRsaWVyKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjI1KSkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChyYWNlQm94REYsIGFlcyh4ID0gbGFiZWxzLCB5ID0gcmFjZURhdGEsIGNvbG9yID0gYWxsQ29tbWlzc2lvbikpICsNCiAgZ2VvbV9ib3hwbG90KCkgKyBnZ3RpdGxlKCJSYWNlIERpZmZlcmVuY2VzIGJ5IFN0YXRlIikgKyB5bGFiKCJBYnNvbHV0ZSBEaWZmZXJlbmNlIikgKyANCiAgeGxhYigiIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KYGBge3J9DQphbGxPdXRsaWVyIDwtIGFsbEJveERGICU+JQ0KICBncm91cF9ieShsYWJlbHMsIGFsbENvbW1pc3Npb24pICU+JQ0KICBtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKGFsbERhdGEpLCBwYXN0ZShhbGxTdGF0ZXMsIGFzLmNoYXJhY3RlcihkaXN0cmljdCksIHNlcCA9ICIgIiksICIiKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChhbGxPdXRsaWVyLCBhZXMoeCA9IGxhYmVscywgeSA9IGFsbERhdGEpKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGFsbENvbW1pc3Npb24pKSArIA0KICBnZ3RpdGxlKCJEZW1vZ3JhcGhpYyBDb25ncmVzc2lvbmFsIERpc3RyaWN0IERpZmZlcmVuY2VzIGJ5IERpc3RyaWN0IERyYXdpbmcgTWV0aG9kIikgKyB5bGFiKCJBYnNvbHV0ZSBEaWZmZXJlbmNlIikgKyANCiAgeGxhYigiIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAjZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IG91dGxpZXIpKSArDQogIGZhY2V0X3dyYXAofiBsYWJlbHMsIHNjYWxlcyA9ICJmcmVlIikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChhbGxPdXRsaWVyLCBhZXMoeCA9IGxhYmVscywgeSA9IGFsbERhdGEpKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGFsbENvbW1pc3Npb24pKSArIA0KICBnZ3RpdGxlKCJEZW1vZ3JhcGhpYyBDb25ncmVzc2lvbmFsIERpc3RyaWN0IERpZmZlcmVuY2VzIGJ5IERpc3RyaWN0IERyYXdpbmcgTWV0aG9kIikgKyB5bGFiKCJBYnNvbHV0ZSBEaWZmZXJlbmNlIikgKyANCiAgeGxhYigiIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBmYWNldF93cmFwKH4gbGFiZWxzLCBzY2FsZXMgPSAiZnJlZSIpDQpgYGANCg0KYGBge3J9DQpvbmx5T3V0bGllcnMgPC0gZmlsdGVyKGFsbE91dGxpZXIsIG91dGxpZXIgIT0gIiIpDQoNCmdncGxvdChvbmx5T3V0bGllcnMsIGFlcyhhbGxTdGF0ZXMpKSArIGdlb21fYmFyKCkNCmBgYA0KYGBge3J9DQoNCm91dGxpZXJEaXN0cmljdENvdW50IDwtIG9ubHlPdXRsaWVycyAlPiUNCiAgZ3JvdXBfYnkob3V0bGllcikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZmlsdGVyKG4gPiAyKSAlPiUNCiAgbXV0YXRlKHN0YXRlPSBnc3ViKCdbWzpkaWdpdDpdXSsnLCAnJywgb3V0bGllcikpDQoNCmdncGxvdChvdXRsaWVyRGlzdHJpY3RDb3VudCwgYWVzKG91dGxpZXIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgYWVzKHkgPSBuLCBmaWxsPXN0YXRlKSkgKw0KICBnZ3RpdGxlKCJOdW1iZXIgb2YgVmFyaWFibGVzIERpc3RyaWN0IGlzIGFuIE91dGxpZXIgT24gKD4gMikiKSArDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHhsYWIoIkRpc3RyaWN0IikgKyB5bGFiKCJOdW1iZXIgb2YgT3V0bGllcnMiKQ0KICANCmBgYA0KYGBge3J9DQp0b3RhbE91dGxpZXJDb3VudCA8LSBhbGxCb3hERiAlPiUNCiAgZ3JvdXBfYnkobGFiZWxzLCBhbGxTdGF0ZXMpICU+JQ0KICBtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKGFsbERhdGEpLCBwYXN0ZShhbGxTdGF0ZXMsIGFzLmNoYXJhY3RlcihkaXN0cmljdCksIHNlcCA9ICIgIiksICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZmlsdGVyKG91dGxpZXIgIT0gIiIpICU+JQ0KICBncm91cF9ieShvdXRsaWVyKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBmaWx0ZXIobiA+IDMpICU+JQ0KICBtdXRhdGUoc3RhdGU9IGdzdWIoJ1tbOmRpZ2l0Ol1dKycsICcnLCBvdXRsaWVyKSkNCg0KZ2dwbG90KHRvdGFsT3V0bGllckNvdW50LCBhZXMob3V0bGllcikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoeSA9IG4sIGZpbGw9c3RhdGUpKSArDQogIGdndGl0bGUoIk51bWJlciBvZiBWYXJpYWJsZXMgRGlzdHJpY3QgaXMgYW4gT3V0bGllciBPbiAoPiAzKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEsdmp1c3Q9MC41KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgeGxhYigiRGlzdHJpY3QiKSArIHlsYWIoIk51bWJlciBvZiBPdXRsaWVycyIpDQpgYGANCg0KYGBge3J9DQpzdGF0ZU91dGxpZXJQcm9wIDwtIGFsbEJveERGICU+JQ0KICBncm91cF9ieShsYWJlbHMsIGFsbENvbW1pc3Npb24pICU+JQ0KICBtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKGFsbERhdGEpLCBwYXN0ZShhbGxTdGF0ZXMsIGFzLmNoYXJhY3RlcihkaXN0cmljdCksIHNlcCA9ICIgIiksICIiKSkgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50X291dGxpZXIgPSAoKGxlbmd0aCh1bmlxdWUob3V0bGllcikpLTEpL24oKSkpDQoNCmdncGxvdChzdGF0ZU91dGxpZXJQcm9wLCBhZXMoYWxsQ29tbWlzc2lvbikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoeSA9IHBlcmNlbnRfb3V0bGllciwgZmlsbD1hbGxDb21taXNzaW9uKSkgKw0KICBnZ3RpdGxlKCJQcm9wb3J0aW9uIG9mIERpc3RyaWN0cyBhcmUgT3V0bGllcnMgYnkgRGlzdHJpY3QgRHJhd2luZyBDb21taXNzaW9uIikgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSx2anVzdD0wLjUpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICB4bGFiKCJEaXN0cmljdCIpICsgeWxhYigiTnVtYmVyIG9mIE91dGxpZXJzIikgKyBmYWNldF93cmFwKH4gbGFiZWxzLCBzY2FsZXMgPSAiZnJlZSIpDQpgYGANCmBgYHtyfQ0KcGVubk91dGxpZXJDb3VudCA8LSBhbGxPdXRsaWVyICU+JQ0KICBmaWx0ZXIoYWxsU3RhdGVzID09ICJQZW5uc3lsdmFuaWEiKSAlPiUNCiAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JQ0KICBzdW1tYXJpc2UodGltZXNfb3V0bGllciA9IHN1bShpZmVsc2Uob3V0bGllciAhPSAiIiwxLDApKSkgDQpgYGANCg0KYGBge3J9DQpyZXF1aXJlKHRpZHl2ZXJzZSkNCnJlcXVpcmUoZ2dwbG90MikNCnJlcXVpcmUoc2YpDQpyZXF1aXJlKGdnbWFwKQ0KDQpnZXRfY29uZ3Jlc3NfbWFwIDwtIGZ1bmN0aW9uKGNvbmc9MTEzKSB7DQogIHRtcF9maWxlIDwtIHRlbXBmaWxlKCkNCiAgdG1wX2RpciAgPC0gdGVtcGRpcigpDQogIHpwIDwtIHNwcmludGYoImh0dHA6Ly9jZG1hcHMucG9saXNjaS51Y2xhLmVkdS9zaHAvZGlzdHJpY3RzJTAzaS56aXAiLGNvbmcpDQogIGRvd25sb2FkLmZpbGUoenAsIHRtcF9maWxlKQ0KICB1bnppcCh6aXBmaWxlID0gdG1wX2ZpbGUsIGV4ZGlyID0gdG1wX2RpcikNCiAgZnBhdGggPC0gcGFzdGUodG1wX2Rpciwgc3ByaW50ZigiZGlzdHJpY3RTaGFwZXMvZGlzdHJpY3RzJTAzaS5zaHAiLGNvbmcpLCBzZXAgPSAiLyIpDQogIHN0X3JlYWQoZnBhdGgpDQp9DQpjZDExNCA8LSBnZXRfY29uZ3Jlc3NfbWFwKDExNCkNCg0KY2QxMTRfcGEgPC0gY2QxMTQgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKFNUQVRFTkFNRT09IlBlbm5zeWx2YW5pYSIpICU+JQ0KICAgICAgICAgICAgbXV0YXRlKERJU1RSSUNUID0gYXMuY2hhcmFjdGVyKERJU1RSSUNUKSkgJT4lDQogICAgICAgICAgICBzZWxlY3QoRElTVFJJQ1QpDQoNCm91dGxpZXJfcGEgPC0gdGliYmxlKERJU1RSSUNUPWFzLmNoYXJhY3RlcigxOjE4KSwNCiAgICAgICAgICAgICAgICAgICBPdXRsaWVycyA9IHBlbm5PdXRsaWVyQ291bnQkdGltZXNfb3V0bGllcikNCg0KY2QxMTRfcGEgPC0gY2QxMTRfcGEgJT4lIGxlZnRfam9pbihvdXRsaWVyX3BhLCBieT0iRElTVFJJQ1QiKQ0KY2QxMTRfcGENCg0KYGBgDQpgYGB7cn0NCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigidGlkeXZlcnNlL2dncGxvdDIiKQ0KcmVxdWlyZShnZ3Bsb3QyKQ0KYGBgDQoNCmBgYHtyfQ0KQVBJX2tleSA9ICdBSXphU3lBY0ZQNGFxYkt6emVhQnRLOXhkeVVzWDNMd2FtOXpEQUEnDQpyZWdpc3Rlcl9nb29nbGUoa2V5ID0gQVBJX2tleSkNCg0KZG0gPC0gZ2V0X21hcChsb2NhdGlvbj0iV2FzaGluZ3RvbiIsIHpvb209NikgDQpndyA8LSBnb29nbGVfbWFwKGtleSA9IEFQSV9rZXksIHpvb20gPSA2KQ0KYGBgDQoNCg0KYGBge3J9DQptYXA8LWdldF9tYXAobG9jYXRpb24gPSBjKC03Ny4xOTQ1LDQxLjIwMzMpLCB6b29tPTcpDQoNCmdnbWFwKG1hcCkgKyANCiAgZ2VvbV9zZihkYXRhPWNkMTE0X3BhLGFlcyhmaWxsPU91dGxpZXJzKSxpbmhlcml0LmFlcz1GQUxTRSxhbHBoYT0wLjkpICsgDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZWVuIiwgaGlnaCA9ICJyZWQiLCBsaW1pdHM9YygwLDcpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQpgYGB7cn0NCndhc2hPdXRsaWVyQ291bnQgPC0gYWxsT3V0bGllciAlPiUNCiAgZmlsdGVyKGFsbFN0YXRlcyA9PSAiV2FzaGluZ3RvbiIpICU+JQ0KICBncm91cF9ieShkaXN0cmljdCkgJT4lDQogIHN1bW1hcmlzZSh0aW1lc19vdXRsaWVyID0gc3VtKGlmZWxzZShvdXRsaWVyICE9ICIiLDEsMCkpKQ0KDQpjZDExNF93YSA8LSBjZDExNCAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoU1RBVEVOQU1FPT0iV2FzaGluZ3RvbiIpICU+JQ0KICAgICAgICAgICAgbXV0YXRlKERJU1RSSUNUID0gYXMuY2hhcmFjdGVyKERJU1RSSUNUKSkgJT4lDQogICAgICAgICAgICBzZWxlY3QoRElTVFJJQ1QpDQoNCm91dGxpZXJfd2EgPC0gdGliYmxlKERJU1RSSUNUPWFzLmNoYXJhY3RlcigxOjEwKSwNCiAgICAgICAgICAgICAgICAgICBPdXRsaWVycyA9IHdhc2hPdXRsaWVyQ291bnQkdGltZXNfb3V0bGllcikNCg0KY2QxMTRfd2EgPC0gY2QxMTRfd2EgJT4lIGxlZnRfam9pbihvdXRsaWVyX3dhLCBieT0iRElTVFJJQ1QiKQ0KYGBgDQoNCmBgYHtyfQ0KbWFwPC1nZXRfbWFwKGxvY2F0aW9uID0gYygtMTIwLjc0MDEsNDcuNzUxMSksIHpvb209NikNCmBgYA0KDQpgYGB7cn0NCmdnbWFwKG1hcCkgKyANCiAgZ2VvbV9zZihkYXRhPWNkMTE0X3dhLGFlcyhmaWxsPU91dGxpZXJzKSxpbmhlcml0LmFlcz1GQUxTRSxhbHBoYT0wLjkpICsgDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZWVuIiwgaGlnaCA9ICJyZWQiLCBsaW1pdHM9YygwLDcpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQpgYGB7cn0NCnR4T3V0bGllckNvdW50IDwtIGFsbE91dGxpZXIgJT4lDQogIGZpbHRlcihhbGxTdGF0ZXMgPT0gIlRleGFzIikgJT4lDQogIGdyb3VwX2J5KGRpc3RyaWN0KSAlPiUNCiAgc3VtbWFyaXNlKHRpbWVzX291dGxpZXIgPSBzdW0oaWZlbHNlKG91dGxpZXIgIT0gIiIsMSwwKSkpDQoNCmNkMTE0X3R4IDwtIGNkMTE0ICU+JSANCiAgICAgICAgICAgIGZpbHRlcihTVEFURU5BTUU9PSJUZXhhcyIpICU+JQ0KICAgICAgICAgICAgbXV0YXRlKERJU1RSSUNUID0gYXMuY2hhcmFjdGVyKERJU1RSSUNUKSkgJT4lDQogICAgICAgICAgICBzZWxlY3QoRElTVFJJQ1QpDQoNCm91dGxpZXJfdHggPC0gdGliYmxlKERJU1RSSUNUPWFzLmNoYXJhY3RlcigxOjM2KSwNCiAgICAgICAgICAgICAgICAgICBPdXRsaWVycyA9IHR4T3V0bGllckNvdW50JHRpbWVzX291dGxpZXIpDQoNCmNkMTE0X3R4IDwtIGNkMTE0X3R4ICU+JSBsZWZ0X2pvaW4ob3V0bGllcl90eCwgYnk9IkRJU1RSSUNUIikNCmBgYA0KDQpgYGB7cn0NCm1hcDwtZ2V0X21hcChsb2NhdGlvbiA9IGMoLTk5LjkwMTgsMzEuOTY4OSksIHpvb209NikNCmBgYA0KYGBge3J9DQpnZ21hcChtYXApICsgDQogIGdlb21fc2YoZGF0YT1jZDExNF90eCxhZXMoZmlsbD1PdXRsaWVycyksaW5oZXJpdC5hZXM9RkFMU0UsYWxwaGE9MC45KSArIA0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmVlbiIsIGhpZ2ggPSAicmVkIiwgbGltaXRzPWMoMCw3KSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7cn0NCmNhT3V0bGllckNvdW50IDwtIGFsbE91dGxpZXIgJT4lDQogIGZpbHRlcihhbGxTdGF0ZXMgPT0gIkNhbGlmb3JuaWEiKSAlPiUNCiAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JQ0KICBzdW1tYXJpc2UodGltZXNfb3V0bGllciA9IHN1bShpZmVsc2Uob3V0bGllciAhPSAiIiwxLDApKSkNCg0KY2QxMTRfY2EgPC0gY2QxMTQgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKFNUQVRFTkFNRT09IkNhbGlmb3JuaWEiKSAlPiUNCiAgICAgICAgICAgIG11dGF0ZShESVNUUklDVCA9IGFzLmNoYXJhY3RlcihESVNUUklDVCkpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KERJU1RSSUNUKQ0KDQpvdXRsaWVyX2NhIDwtIHRpYmJsZShESVNUUklDVD1hcy5jaGFyYWN0ZXIoMTo1MyksDQogICAgICAgICAgICAgICAgICAgT3V0bGllcnMgPSBjYU91dGxpZXJDb3VudCR0aW1lc19vdXRsaWVyKQ0KDQpjZDExNF9jYSA8LSBjZDExNF9jYSAlPiUgbGVmdF9qb2luKG91dGxpZXJfY2EsIGJ5PSJESVNUUklDVCIpDQpgYGANCg0KYGBge3J9DQptYXA8LWdldF9tYXAobG9jYXRpb24gPSBjKC0xMTkuNDE3OSwzNi43NzgzKSwgem9vbT02KQ0KYGBgDQpgYGB7cn0NCmdnbWFwKG1hcCkgKyANCiAgZ2VvbV9zZihkYXRhPWNkMTE0X2NhLGFlcyhmaWxsPU91dGxpZXJzKSxpbmhlcml0LmFlcz1GQUxTRSxhbHBoYT0wLjkpICsgDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZWVuIiwgaGlnaCA9ICJyZWQiLCBsaW1pdHM9YygwLDcpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQpgYGB7cn0NCm1hcF9wYTwtZ2V0X21hcChsb2NhdGlvbiA9IGMoLTc3LjE5NDUsNDEuMjAzMyksIHpvb209NykNCm1hcF93YTwtZ2V0X21hcChsb2NhdGlvbiA9IGMoLTEyMC43NDAxLDQ3Ljc1MTEpLCB6b29tPTYpDQptYXBfdHg8LWdldF9tYXAobG9jYXRpb24gPSBjKC05OS45MDE4LDMxLjk2ODkpLCB6b29tPTYpDQptYXBfY2E8LWdldF9tYXAobG9jYXRpb24gPSBjKC0xMTkuNDE3OSwzNi43NzgzKSwgem9vbT02KQ0KYGBgDQoNCmBgYHtyfQ0Kdm90ZXNoYXJlX3BhIDwtIHRpYmJsZShESVNUUklDVD1hcy5jaGFyYWN0ZXIoMToxOCksDQogICAgICAgICAgICAgICAgICAgYEF2ZXJhZ2UgRCBWb3Rlc2hhcmVgID0gZmlsdGVyKGF2Z192b3RlcywgU3RhdGUgPT0gIlBlbm5zeWx2YW5pYSIpJEF2ZXJhZ2UpDQoNCmNkMTE0X3ZvdGVfcGEgPC0gY2QxMTRfcGEgJT4lIGxlZnRfam9pbih2b3Rlc2hhcmVfcGEsIGJ5PSJESVNUUklDVCIpDQpgYGANCg0KYGBge3J9DQpnZ21hcChtYXBfcGEpICsgDQogIGdlb21fc2YoZGF0YT1jZDExNF92b3RlX3BhLGFlcyhmaWxsPWBBdmVyYWdlIEQgVm90ZXNoYXJlYCksaW5oZXJpdC5hZXM9RkFMU0UsYWxwaGE9MC45KSArIA0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiLCBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQpgYGB7cn0NCnZvdGVzaGFyZV93YSA8LSB0aWJibGUoRElTVFJJQ1Q9YXMuY2hhcmFjdGVyKDE6MTApLA0KICAgICAgICAgICAgICAgICAgIGBBdmVyYWdlIEQgVm90ZXNoYXJlYCA9IGZpbHRlcihhdmdfdm90ZXMsIFN0YXRlID09ICJXYXNoaW5ndG9uIikkQXZlcmFnZSkNCg0KY2QxMTRfdm90ZV93YSA8LSBjZDExNF93YSAlPiUgbGVmdF9qb2luKHZvdGVzaGFyZV93YSwgYnk9IkRJU1RSSUNUIikNCmBgYA0KDQpgYGB7cn0NCmdnbWFwKG1hcF93YSkgKyANCiAgZ2VvbV9zZihkYXRhPWNkMTE0X3ZvdGVfd2EsYWVzKGZpbGw9YEF2ZXJhZ2UgRCBWb3Rlc2hhcmVgKSxpbmhlcml0LmFlcz1GQUxTRSxhbHBoYT0wLjkpICsgDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gInJlZCIsIGhpZ2ggPSAiYmx1ZSIsIGxpbWl0cz1jKDAsMSkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpDQpgYGANCmBgYHtyfQ0Kdm90ZXNoYXJlX2NhIDwtIHRpYmJsZShESVNUUklDVD1hcy5jaGFyYWN0ZXIoMTo1MyksDQogICAgICAgICAgICAgICAgICAgYEF2ZXJhZ2UgRCBWb3Rlc2hhcmVgID0gZmlsdGVyKGF2Z192b3RlcywgU3RhdGUgPT0gIkNhbGlmb3JuaWEiKSRBdmVyYWdlKQ0KDQpjZDExNF92b3RlX2NhIDwtIGNkMTE0X2NhICU+JSBsZWZ0X2pvaW4odm90ZXNoYXJlX2NhLCBieT0iRElTVFJJQ1QiKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dtYXAobWFwX2NhKSArIA0KICBnZW9tX3NmKGRhdGE9Y2QxMTRfdm90ZV9jYSxhZXMoZmlsbD1gQXZlcmFnZSBEIFZvdGVzaGFyZWApLGluaGVyaXQuYWVzPUZBTFNFLGFscGhhPTAuOSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KYGBge3J9DQp2b3Rlc2hhcmVfdHggPC0gdGliYmxlKERJU1RSSUNUPWFzLmNoYXJhY3RlcigxOjM2KSwNCiAgICAgICAgICAgICAgICAgICBgQXZlcmFnZSBEIFZvdGVzaGFyZWAgPSBmaWx0ZXIoYXZnX3ZvdGVzLCBTdGF0ZSA9PSAiVGV4YXMiKSRBdmVyYWdlKQ0KDQpjZDExNF92b3RlX3R4IDwtIGNkMTE0X3R4ICU+JSBsZWZ0X2pvaW4odm90ZXNoYXJlX3R4LCBieT0iRElTVFJJQ1QiKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dtYXAobWFwX3R4KSArIA0KICBnZW9tX3NmKGRhdGE9Y2QxMTRfdm90ZV90eCxhZXMoZmlsbD1gQXZlcmFnZSBEIFZvdGVzaGFyZWApLGluaGVyaXQuYWVzPUZBTFNFLGFscGhhPTAuOSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaCA9ICJibHVlIiwgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7cn0NCm1hcF9waGlsbHkgPC0gZ2V0X21hcChjKC03NS4xNjUyLDM5Ljk1MjYpLCB6b29tPTkpDQpgYGANCg0KYGBge3J9DQpnZ21hcChtYXBfcGhpbGx5KSArIA0KICBnZW9tX3NmKGRhdGE9Y2QxMTRfcGEsYWVzKGZpbGw9T3V0bGllcnMpLGluaGVyaXQuYWVzPUZBTFNFLGFscGhhPTAuOSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gInJlZCIsIGxpbWl0cz1jKDAsNykpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KYGBge3J9DQptYXBfbGEgPC0gZ2V0X21hcChjKC0xMTguMjQzNywzNC4wNTIyKSwgem9vbT04KQ0KYGBgDQoNCmBgYHtyfQ0KZ2dtYXAobWFwX2xhKSArDQogIGdlb21fc2YoZGF0YT1jZDExNF9jYSxhZXMoZmlsbD1PdXRsaWVycyksaW5oZXJpdC5hZXM9RkFMU0UsYWxwaGE9MC45KSArIA0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmVlbiIsIGhpZ2ggPSAicmVkIiwgbGltaXRzPWMoMCw3KSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7cn0NCm1hcF9kYWxsYXMgPC0gZ2V0X21hcChjKC05Ni43OTcwLDMyLjc3NjcpLCB6b29tPTcpDQpgYGANCg0KYGBge3J9DQpnZ21hcChtYXBfZGFsbGFzKSArIA0KICBnZW9tX3NmKGRhdGE9Y2QxMTRfdHgsYWVzKGZpbGw9T3V0bGllcnMpLGluaGVyaXQuYWVzPUZBTFNFLGFscGhhPTAuOSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gInJlZCIsIGxpbWl0cz1jKDAsNykpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpDQpgYGANCmBgYHtyfQ0KbWFwX2hvdSA8LSBnZXRfbWFwKGMoLTk1LjM2OTgsMjkuNzYwNCksIHpvb209OCkNCmBgYA0KDQpgYGB7cn0NCmdnbWFwKG1hcF9ob3UpICsgDQogIGdlb21fc2YoZGF0YT1jZDExNF90eCxhZXMoZmlsbD1PdXRsaWVycyksaW5oZXJpdC5hZXM9RkFMU0UsYWxwaGE9MC45KSArIA0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmVlbiIsIGhpZ2ggPSAicmVkIiwgbGltaXRzPWMoMCw3KSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQo=